测试环境:mysql5.5
测试场景:单表60w、111w、288w、500w数据下,对文章字段进行关键字查询匹配。

四个表结构都是一样的,如下

  1. CREATE TABLE `blog_test_60w` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `num` int(11) DEFAULT NULL,
  4. `text` varchar(1000) DEFAULT NULL,
  5. PRIMARY KEY (`id`),
  6. KEY `text` (`text`(333))
  7. ) ENGINE=MyISAM AUTO_INCREMENT=608587 DEFAULT CHARSET=utf8;

四个表名称及数据行数如下

  1. mysql> select table_name,table_rows from tables where TABLE_SCHEMA = 'test' order by table_rows desc;
  2. +------------------------+------------+
  3. | table_name | table_rows |
  4. +------------------------+------------+
  5. | test_520w | 5208686 |
  6. | test_288w | 2881386 |
  7. | test_111w | 1117786 |
  8. | test_60w | 608586 |
  9. +------------------------+------------+
  10. 4 rows in set

部分数据

  1. mysql> select * from test_60w order by id desc limit 10;
  2. +--------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. | id | num | text |
  4. +--------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | 608586 | 34929 | 【写在开始的话】从34日上午开始,新浪财经国际组将为广大网友实时直播全球财经新闻,这是一个以快讯为主,帮助网友实时把握环球市场脉动,力求零时差的直播栏目。一切影响全球市场的资讯,我们都报道;一切关系您财富的市场,我们都关心。请广大网友多多支持我们,您的关注就是我们的动力。 |
  6. | 608585 | 34930 | 中国人民银行:更为灵活的汇率是改革的关键步骤,应该让市场力量在中国汇率的确定中发挥作用。 |
  7. | 608584 | 34931 | 两位消息人士透露,首批民营银行将试点四家,其中,浙江温州在首批试点名单内。(大智慧通讯社) |
  8. | 608583 | 34932 | 台湾加权指数开盘涨0.9%至8630.84 |
  9. | 608582 | 34933 | 澳大利亚2013年第四季GDP经季调的环比增长率为0.8%(预期0.7% 前值0.6%);同比增长率2.8%(预期2.5% 前值2.3%) |
  10. | 608581 | 34934 | 中国交通运输部长杨传堂:中国将优先发展公共交通系统。 |
  11. | 608580 | 34936 | 李克强:果断向污染宣战。政府工作报告稿显示:中国将淘汰600万辆不符合环保标准的汽车。今年计划关闭5万个燃煤炉。中国将鼓励太阳能发电和风电,并启动核电项目。 |
  12. | 608579 | 34937 | 联储拉克尔(里士满联储行长):商品市场对乌克兰消息的吸收状况“良好”,目前事态仍有潜在风险,但处于可管理水平;预计美国2015年初第一次加息,联储政策的意义并不仅仅取决于金融稳定方面的考虑;个人并不反对更为快速地缩减QE,目前的退出策略“相当合理”。 |
  13. | 608578 | 34938 | 【花旗:乌克兰对全球经济的冲击或仅是开始】花旗指出,鉴于欧元区自诞生以来几乎没有遭遇到过这种与自身切身相关的地缘矛盾冲突状况,因此各界仍然低估了其可能造成的负面影响。而事实上,美欧与俄罗斯之间的关系可能在此后进一步降入冰点。 |
  14. | 608577 | 34939 | 中国财政部:将于312日出售280亿元3年期国债。 |
  15. +--------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  16. 10 rows in set

60w条数据

先查看符合的数据条数,共有17w条

  1. mysql> select count(*) from test_60w where text like '%年%';
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 173879 |
  6. +----------+
  7. 1 row in set

进行查询

代码汇

111w条数据

先查看符合的数据条数,共有32w条

  1. mysql> select count(*) from test_111w where text like '%年%';
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 320984 |
  6. +----------+
  7. 1 row in set

进行查询

代码汇

288w条数据

先查看符合的数据条数,共有83w条

  1. mysql> select count(*) from test_288w where text like '%年%';
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 832991 |
  6. +----------+
  7. 1 row in set

进行查询

代码汇

520w条数据

先查看符合的数据条数,共有150w条

  1. mysql> select count(*) from test_520w where text like '%年%';
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 1507269 |
  6. +----------+
  7. 1 row in set

数据太大,一次运行内存扛不住,分两次运行

代码汇


代码汇

总结

感觉like总是比其他几个快,不知道是我服务器还是数据比较特别。网上搜索like模糊查询优化,基本都是千篇一律,不用like,推荐LOCATE、POSITION、INSTR。我也很郁闷。

通过Explain查看四个方法都是不走索引的。当然了,数据量大也不会这样直接查询的,也可以创建FullText全文索引,或者全文搜索引擎之类的,比如sphinx、elasticsearch等。

本文纯属娱乐测试。

学习elasticsearch可以从这篇文章开始看:elasticsearch安装