索引与like优化
未建索引
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优化的更多相关文章
- 浅谈B+树索引的分裂优化(转)
http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化 原文链接:http://hedengcheng.com/ ...
- 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程
上星期写了一个篇文章,数据库方面的面试技巧,如何从建表方面展示自己能力,承蒙管理员抬举,放入首页,也承蒙各位厚爱,两天内收获了将近770个点击,也一度进入48小时热榜. 为了感谢管理员和大家的支持,再 ...
- MySQL 如何创建索引?怎么优化?
索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.My ...
- Oracle 学习总结 - 表和索引的性能优化
表的性能 表的性能取决于创建表之前所应用的数据库特性,数据库->表空间->表,创建数据库时确保为每个用户创建一个默认的永久表空间和临时表空间并使用本地管理,创建表空间设为本地管理并且自动段 ...
- Mysql 索引原理及优化
本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...
- MySQL索引类型,优化,使用数据结构
工欲善其事必先利其器 半藏说道:“若你在路途中遇到上帝,上帝也会被割伤.” 一.mysql 索引分类(默认使用B树结构)在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 My ...
- (转)Mysql 索引原理及优化
本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...
- 基于索引的MySQL优化
今天查看MySQL慢查询日志,查看一个四表关联的SQL操作,耗时1006s.这次也是基于基于子查询的思路,对上表进行优化.使时间复杂度降到n^2级别.但优化之后时间反而是原来的三倍多. 原SQL语句: ...
- MySQL索引类型及优化
索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...
- 好书推荐之Mysql三剑客 :《高性能Mysql》、《Mysql技术内幕》、《数据库索引设计与优化》
Mysql三剑客系列书籍: 大佬推荐 首先推荐<高性能 MySQL>,这本书是 MySQL 领域的经典之作,拥有广泛的影响力.不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习.不 ...
随机推荐
- Zabbix监控windows的CPU利用率和其他资源
zabbix的WEB端--配置-模板--Template OS Windows--项目--创建项目 名称:UserPerfCountercpu 键值:UserPerfCountercpu 数据类型:数 ...
- word2vec 的理解
1.CBOW 模型 CBOW模型包括输入层.投影层.输出层.模型是根据上下文来预测当前词,由输入层到投影层的示意图如下: 这里是对输入层的4个上下文词向量求和得到的当前词向量,实际应用中,上下文窗口大 ...
- Z-tree 统计每一父节点的叶子节点数(看这一篇就够了)
最近刚走出校园的我找到了第一份工作,在入职考核中就遇见了一道Z-tree的试题 这道题目本身是不难的,但是我第一次接触这个插件而且还把解决问题的方向搞错了,弄的我好几天都很难受. 弄得我都开始怀疑人生 ...
- var与dynamic
var与dynamic 如果你用MVC写过程序,那么你应该知道ViewBag这个用于前后台的数据传递工具,那么你是否对ViewBag的用法感到过疑惑呢? ViewBag.Mode1l=new obje ...
- 开发组件:REST API
REST API 最佳入门指南 https://blog.csdn.net/px01ih8/article/details/78674685
- 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9 20165233
Exp6 信息搜集与漏洞扫描 目录 一.基础问题 二.实验步骤 实验点一:各种搜索技巧的应用 实验点二:DNS IP注册信息的查询 实验点三:基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...
- 查看虚拟机CENTOS7 的 IP 地址和命令
用于生产环境下 安装CENTOS7 太费时间, 研究阶段 放在虚拟机里面 是最好的选择: 但是安装完毕后 就出现问题 无法使用IFCONFIG : 毕竟 内核不一样 首先我们登录操作系统 用 ...
- Linux运维面试贩卖思路如下
1.自我介绍 2.技术介绍 3.上家公司情况介绍.多少人的团队.运维多少人.多少设备.公司什么业务.访问量多少.并发多少.架构多大,然后介绍公司架构.CDN->负载均衡->web-> ...
- 0_Simple__simpleStreams
对比使用单流和多流(4条)情况下数据拷贝,以及数据拷贝加内核调用的效率差别.▶ 源代码 #include <stdio.h> #include <cuda_runtime.h> ...
- Python--001
C 和 Python.Java.C#等 C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作 其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处 ...