索引与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值的降低。

时间: 2024-07-30 03:23:13

索引与like优化的相关文章

MySQL高级 之 索引失效与优化详解

案例所用的表结构.索引.与数据如下:   索引失效与优化 1.全值匹配我最爱 2.最佳左前缀法则(带头索引不能死,中间索引不能断) 如果索引了多个列,要遵守最佳左前缀法则.指的是查询从索引的最左前列开始 并且 不跳过索引中的列. 正确的示例参考上图. 错误的示例: 带头索引死:  中间索引断(带头索引生效,其他索引失效):  3.不要在索引上做任何操作(计算.函数.自动/手动类型转换),不然会导致索引失效而转向全表扫描 4.mysql存储引擎不能继续使用索引中范围条件(bettween.<.>

Oracle 建立索引及SQL优化

Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引 复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问速度. 建设原则: 1.索引应该经常建在Where 子句经常用到的列上.如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%.则应该考虑. 2.对于两表连接的字段,应该建立索引.如果经常在某表的一个字段进行Order By 则也经过进行索引. 3.不应该在小表上建设索引. 优缺点:

LDAP索引及缓存优化

一.设置索引 索引将查找信息和 Directory Server 条目关联起来. Directory Server支持以下几种索引: 1出现索引 (pres) - 列出了具有特定属性的条目,与属性的值无关. 2等式索引 (eq) - 使您能够高效地搜索包含特定属性值的条目. 3近似索引 (approx) - 通过使用 ~= 过滤运算符提供了高效的"音似"搜索功能. 例如,近似索引对于搜索部分名称或拼错的名称很有用.Directory Server 使用 变音位语音算法的一个变体来执行近

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

上星期写了一个篇文章,数据库方面的面试技巧,如何从建表方面展示自己能力,承蒙管理员抬举,放入首页,也承蒙各位厚爱,两天内收获了将近770个点击,也一度进入48小时热榜. 为了感谢管理员和大家的支持,再根据我的面试经验原创一篇关于索引方面如何推销自己的文章.这内容也来自我写的书 java web轻量级开发面试教程. 如果我们需要招个Java方面的高级程序员,一方面看年限(本科3年),具体到数据库方面的技能要求,包括如下三个方面: 第一,是否会基本的增删改查,存储过程等技能,是否会用些group b

MySQL索引类型及优化

索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表: CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL ); 我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找username="admin"的记录 SELECT *

索引与sql优化问题汇总

各位亲爱的云友, 非常感谢大家踊跃参加DBA专家门诊一期:索引与sql优化,很多云友都提出了自己的问题,门诊主任医师玄惭对大家提的问题一一作了解答.现已整理好这些问题,分享在此,欢迎来拿,绝对干货! 篇幅较长,耐心细看! 我们将赠送每位提问者每人一本凌云杂志第四期,请各位以论坛短消息形式将姓名.电话.地址发送给管理员xiaofanqie. 啊里新人(Q1):索引我一般都是只有主键,这玩意儿,是不是越少越好? 玄惭(A1):在日常的业务开发中,常见使用到索引的地方大概有两类: 第一类.做业务约束需

(转)Mysql 索引原理及优化

本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 二.常见的查询算法及数据结构 为什么这里要讲查询算

数据库索引设计与优化

这篇是计算机中数据库设计类的优质预售推荐<数据库索引设计与优化>. 盖国强.姜承尧.金官丁.叶金荣.童家旺一众国内数据库界巨腕争相作序|支付宝.网易.云和恩墨联DB掌门连袂推荐的造是什么书吗? 编辑推荐 中国数据库界几大势力云集于这本旷世奇作,没读过咋好意思和DBA同行打招呼 蚂蚁(原支付宝)数据库团队资深专家携成长回忆与技术历程倾情献上最优质翻译 本书旨在--通过设计适用于现代硬件的索引,来提升关系型数据库的性能 软硬件发展让数据库性能被忽视,但数据处理量增长更快,全新索引优化设计才能根治随

干货分享:DBA专家门诊一期:索引与sql优化问题汇总

各位亲爱的云友, 非常感谢大家踊跃参加DBA专家门诊一期:索引与sql优化,很多云友都提出了自己的问题,门诊主任医师玄惭对大家提的问题一一作了解答.现已整理好这些问题,分享在此,欢迎来拿,绝对干货! 篇幅较长,耐心细看! 我们将赠送每位提问者每人一本凌云杂志第四期,请各位以论坛短消息形式将姓名.电话.地址发送给管理员xiaofanqie. 啊里新人(Q1):索引我一般都是只有主键,这玩意儿,是不是越少越好? 玄惭(A1):在日常的业务开发中,常见使用到索引的地方大概有两类: 第一类.做业务约束需

数据库索引原理及优化

一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 二.常见的查询算法及数据结构 为什么这里要讲查询算法和数据结构呢?因为之所以要建立索引,其实就是为了构建一种数据结构,可以在上面应用