未建索引

mysql> alter table modulestatus drop index imei;
Query OK, 457922 rows affected (4.29 sec)
Records: 457922 Duplicates: 0 Warnings: 0

mysql> SELECT count(*) from modulestatus where imei like '1%';
+----------+
| count(*) |
+----------+
| 270 |
+----------+
1 row in set (0.53 sec)

mysql> SELECT count(*) from modulestatus where imei like '%1';
+----------+
| count(*) |
+----------+
| 35499 |
+----------+
1 row in set (0.66 sec)

mysql> SELECT count(*) from modulestatus where imei like '1%' and '9%';
+----------+
| count(*) |
+----------+
| 270 |
+----------+
1 row in set, 1 warning (0.49 sec)

建立索引

mysql> alter table modulestatus add index (imei);
Query OK, 457922 rows affected (31.67 sec)
Records: 457922 Duplicates: 0 Warnings: 0

mysql> SELECT count(*) from modulestatus where imei like '1%';
+----------+
| count(*) |
+----------+
| 270 |
+----------+
1 row in set (0.04 sec)

mysql> SELECT count(*) from modulestatus where imei like '%1';
+----------+
| count(*) |
+----------+
| 35499 |
+----------+
1 row in set (0.80 sec)

mysql> SELECT count(*) from modulestatus where imei like '1%' and '9%';
+----------+
| count(*) |
+----------+
| 270 |
+----------+
1 row in set, 1 warning (0.00 sec)

结论

1、like %keyword:索引失效,使用全表扫描。但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描。

2、like keyword%:索引有效。

3、like %keyword% 索引失效,也无法使用反向索引。

未建索引

mysql> SELECT count(*) from modulestatus where imei like '%1%';
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (0.73 sec)

mysql> SELECT count(*) from modulestatus where locate('1',imei);
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (0.76 sec)

建立索引

mysql> alter table modulestatus add index (imei);
Query OK, 457922 rows affected (11.06 sec)
Records: 457922 Duplicates: 0 Warnings: 0

mysql> SELECT count(*) from modulestatus where imei like '%1%';
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (0.93 sec)

mysql> SELECT count(*) from modulestatus where locate('1',imei);
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (0.95 sec)

结论

LOCATE(str,colum)函数,可以代替column like '%str%',但效率并没有明显的差别。

建立索引后,都会减慢like '%str%' 与locate(str,colum)函数查询的速度。

未建立索引

mysql> SELECT count(*) from modulestatus where imei like '%1%';
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (0.73 sec)

mysql> SELECT count(*) from modulestatus where instr(imei,'1');
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (0.79 sec)

建立索引

mysql> SELECT count(*) from modulestatus where imei like '%1%';
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (1.00 sec)

mysql> SELECT count(*) from modulestatus where instr(imei,'1');
+----------+
| count(*) |
+----------+
| 326019 |
+----------+
1 row in set (0.84 sec)

结论

instr(colum,str)函数,可以代替column like '%str%',但效率并没有明显的差别。

建立索引后,都会减慢like '%str%' 与instr(colum,str)函数查询的速度

未建立索引

mysql> SELECT count(*) from modulestatus where imei like '%1';
+----------+
| count(*) |
+----------+
| 35499 |
+----------+
1 row in set (0.90 sec)

mysql> SELECT count(*) from modulestatus where reverse(imei) like reverse('%1');

+----------+
| count(*) |
+----------+
| 35499 |
+----------+
1 row in set (0.70 sec)

建立索引

mysql> alter table modulestatus add index (imei);
Query OK, 457922 rows affected (10.04 sec)
Records: 457922 Duplicates: 0 Warnings: 0

mysql> SELECT count(*) from modulestatus where imei like '%1';
+----------+
| count(*) |
+----------+
| 35499 |
+----------+
1 row in set (1.06 sec)

mysql> SELECT count(*) from modulestatus where reverse(imei) like reverse('%1')

+----------+
| count(*) |
+----------+
| 35499 |
+----------+
1 row in set (0.84 sec)

结论

1、建立索引,会降低like '%str'和reverse(column) like reverse('%str′)的查询速度。

2、不管是建立索引,还是没有建立索引,reverse(column) like reverse('%str′)都要比column like '%str'要快。

注:在执行column like '%str'的时候,执行计划显示,消耗值,io值,cpu值均非常大,原因是like后面前模糊查询导致索引失效,进行全表扫描。

使用翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全扫描。有效降低消耗值,io值,cpu值这三个指标,尤其是io值的降低。

索引与like优化的更多相关文章

  1. 浅谈B+树索引的分裂优化(转)

    http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化   原文链接:http://hedengcheng.com/ ...

  2. 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程

    上星期写了一个篇文章,数据库方面的面试技巧,如何从建表方面展示自己能力,承蒙管理员抬举,放入首页,也承蒙各位厚爱,两天内收获了将近770个点击,也一度进入48小时热榜. 为了感谢管理员和大家的支持,再 ...

  3. MySQL 如何创建索引?怎么优化?

    索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.My ...

  4. Oracle 学习总结 - 表和索引的性能优化

    表的性能 表的性能取决于创建表之前所应用的数据库特性,数据库->表空间->表,创建数据库时确保为每个用户创建一个默认的永久表空间和临时表空间并使用本地管理,创建表空间设为本地管理并且自动段 ...

  5. Mysql 索引原理及优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

  6. MySQL索引类型,优化,使用数据结构

    工欲善其事必先利其器 半藏说道:“若你在路途中遇到上帝,上帝也会被割伤.” 一.mysql 索引分类(默认使用B树结构)在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 My ...

  7. (转)Mysql 索引原理及优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

  8. 基于索引的MySQL优化

    今天查看MySQL慢查询日志,查看一个四表关联的SQL操作,耗时1006s.这次也是基于基于子查询的思路,对上表进行优化.使时间复杂度降到n^2级别.但优化之后时间反而是原来的三倍多. 原SQL语句: ...

  9. MySQL索引类型及优化

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...

  10. 好书推荐之Mysql三剑客 :《高性能Mysql》、《Mysql技术内幕》、《数据库索引设计与优化》

    Mysql三剑客系列书籍: 大佬推荐 首先推荐<高性能 MySQL>,这本书是 MySQL 领域的经典之作,拥有广泛的影响力.不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习.不 ...

随机推荐

  1. numpy里的randn

    这个函数的作用就是从标准正态分布中返回一个或多个样本值.什么是标准正态分布 来源:http://www.360doc.com/content/17/0306/13/32342759_634411464 ...

  2. 联想Z510升级BCM94352HMB刷网卡白名单曲折经历

    联想Z510笔记本:CPU I7 4702MQ没毛病 :内存4G DDR3不上虚拟机办公足够用: 硬盘升级为SSD240G足够用:有线网卡100M,真是垃圾,不过有线网卡是主板上的芯片,这个我可动不了 ...

  3. stm32串口接收完整的数据包

    参考了文章:<stm32串口中断接收方式详细比较> 文章地址:http://bbs.elecfans.com/jishu_357017_1_1.html 借鉴了第四种中断方式 串口的配置这 ...

  4. 双向链表-java完全解析

    原文:https://blog.csdn.net/nzfxx/article/details/51728516 "双向链表"-数据结构算法-之通俗易懂,完全解析 1.概念的引入 相 ...

  5. ElasticSearch 在3节点集群的启动

    ElasticSearch的启动分前台和后台启动 先介绍前台启动: 先在master节点上启动 可以看到已经启动了 同时在slave1.slave2节点上也启动 可以看到都已经启动了! 在浏览器分别打 ...

  6. CentOS重新加载网卡报错 Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/

    重新加载网卡时出现的错误如下: 1 [root@vdb1 dev]# service network restart 2 Shutting down interface eth0: Device st ...

  7. Solr优化案例分析

    随着umc接入主机的数量越来越多,每天产生的syslog日志数量也在剧增, 之前一天产生的syslog数量才不 到1W,随着整个集团的网络设备不端接入,导致现在每天产生的syslog数量大概在180w ...

  8. 暴搜 - Codeforces Round #327 (Div. 2) E. Three States

    E. Three States Problem's Link Mean: 在一个N*M的方格内,有五种字符:'1','2','3','.','#'. 现在要你在'.'的地方修路,使得至少存在一个块'1 ...

  9. C# List<string>和ArrayList用指定的分隔符分隔成字符串

    原文地址:https://www.cnblogs.com/ahwwmb/p/4166707.html 串联字符串数组的所有元素,其中在每个元素之间使用指定的分隔符 List<string> ...

  10. easyui datagrid列使用按钮的一些心得(转)

    http://blog.csdn.net/sskicgah/article/details/16939959 以前,用easyui的datagrid,有时候会用到一些操作选项,比如代码如下: $('# ...