正确使用索引
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,MySQL之所以能够高效的检索数据,可以说全赖索引之功。在索引使用过程中,要注意一下几点。1、MySQL在使用索引时候,采用的是最左匹配原则。如果是单列索引,则很容易理解,若是多列索引,例如idx_a
千家信息网最后更新 2026年11月01日正确使用索引MySQL之所以能够高效的检索数据,可以说全赖索引之功。在索引使用过程中,要注意一下几点。
1、MySQL在使用索引时候,采用的是最左匹配原则。
如果是单列索引,则很容易理解,若是多列索引,例如idx_a_b_c(a,b,c),则可以发挥索引功能组合为(a),(a,b),(a,b,c),并且索引是一次便利没有回溯的,所以如果用到两列以上,除了最后一列外,前面的都需要精确匹配才行。以下的SQL可以用到索引。
select * from t order by a,b,c;
select * from t where a=constant order by b asc,c asc;
select * from t where a=constant order by b desc,c desc;
select * from t where a=constant and b=constant order by c;
select * from t where a=constant and b>constant order by b;
下面的情况用不到索引或者用不到索引进行排序。
select * from t order by a,d;
select * from t where b=constant order by a;
select * from t where a=constant order by b asc,c desc;
2、MySQL在计算列里无法使用索引。
例如下面的SQL不能使用索引。
select * from t where ABS(a)=constant;
select * from t where f(a)=constant;//f为任意函数
3、MySQL在否定条件中不能使用索引。
例如,where条件里面有<>、not in、not exists的时候,即便是这些判断字段上加上索引,也不会起作用。
4、MySQL在join中连接字段类型如果不一致,则不能使用索引。
例如,INT类型的字段不能和VARCHAR类型的字段join,有个例外是CHAR和VARCHAR在定义字段长度一样时候可以join,反之不可以,例如,CHAR(20)和VARCHAR(20)可以利用索引,CHAR(20)和VARCHAR(25)则不行,不管VARCHAR里面实际存储的值是多长。
5、机智地利用覆盖索引。
MySQL利用B+数索引检索数据的时候,如果不是基于聚簇索引,或者说如果不是基于主键的检索,那么即便是SQL语句能够利用索引,但索引返回的信息也只是所需结果行的主键值,要渠道全部数据,还需要通过这些主键值重新导数据文件里再做一次检索操作,这样就需要额外的IO,降低了查询效率。如下例子。
select namespace from dbrequest_info where update_date between '2017-01-01' and '2017-02-01';
如果在dbrequest_info表里有索引(update_date),则可以利用索引进行查询。如果想利用覆盖索引的话,可以添加索引(update_date,namespace)。
6、其他一些需要注意的地方。
索引的分辨度不高,即便使用索引,扫描全表内容也经常超过20%,这就要谨慎添加索引。另外尽快避免使用like查询,特别是like '%name',这种左边模糊匹配的情况,使用MySQL无法使用索引。如果出现隐式的字符类型转换,MySQL也不能使用索引,相当于在判断列上加了函数一样。
1、MySQL在使用索引时候,采用的是最左匹配原则。
如果是单列索引,则很容易理解,若是多列索引,例如idx_a_b_c(a,b,c),则可以发挥索引功能组合为(a),(a,b),(a,b,c),并且索引是一次便利没有回溯的,所以如果用到两列以上,除了最后一列外,前面的都需要精确匹配才行。以下的SQL可以用到索引。
select * from t order by a,b,c;
select * from t where a=constant order by b asc,c asc;
select * from t where a=constant order by b desc,c desc;
select * from t where a=constant and b=constant order by c;
select * from t where a=constant and b>constant order by b;
下面的情况用不到索引或者用不到索引进行排序。
select * from t order by a,d;
select * from t where b=constant order by a;
select * from t where a=constant order by b asc,c desc;
2、MySQL在计算列里无法使用索引。
例如下面的SQL不能使用索引。
select * from t where ABS(a)=constant;
select * from t where f(a)=constant;//f为任意函数
3、MySQL在否定条件中不能使用索引。
例如,where条件里面有<>、not in、not exists的时候,即便是这些判断字段上加上索引,也不会起作用。
4、MySQL在join中连接字段类型如果不一致,则不能使用索引。
例如,INT类型的字段不能和VARCHAR类型的字段join,有个例外是CHAR和VARCHAR在定义字段长度一样时候可以join,反之不可以,例如,CHAR(20)和VARCHAR(20)可以利用索引,CHAR(20)和VARCHAR(25)则不行,不管VARCHAR里面实际存储的值是多长。
5、机智地利用覆盖索引。
MySQL利用B+数索引检索数据的时候,如果不是基于聚簇索引,或者说如果不是基于主键的检索,那么即便是SQL语句能够利用索引,但索引返回的信息也只是所需结果行的主键值,要渠道全部数据,还需要通过这些主键值重新导数据文件里再做一次检索操作,这样就需要额外的IO,降低了查询效率。如下例子。
select namespace from dbrequest_info where update_date between '2017-01-01' and '2017-02-01';
如果在dbrequest_info表里有索引(update_date),则可以利用索引进行查询。如果想利用覆盖索引的话,可以添加索引(update_date,namespace)。
6、其他一些需要注意的地方。
索引的分辨度不高,即便使用索引,扫描全表内容也经常超过20%,这就要谨慎添加索引。另外尽快避免使用like查询,特别是like '%name',这种左边模糊匹配的情况,使用MySQL无法使用索引。如果出现隐式的字符类型转换,MySQL也不能使用索引,相当于在判断列上加了函数一样。
索引
字段
数据
时候
类型
检索
查询
函数
情况
条件
面的
不行
精确
一致
机智
个例
之所以
作用
例子
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技公司简介
中关村互联网 科技集团
科技互联网项目
重庆互联网络科技
科技类互联网
互联网科技英文
互联网科技作文
青岛中康互联网医疗科技有限公司
港股科技和互联网
互联网科技研发水平
内蒙古九一互联网科技
东莞新华互联网科技学校
科技大学互联网
互联网时代的科技公司
上海同邻互联网科技有限公司规模
福州德业互联网科技
互联网科技接地气
互联网领先科技活动
北京天晋互联网科技有限公司
科技发展第三阶段互联网时代
美国互联网科技巨头监管
华宇互联网科技
银优互联网科技有限公司
撒么互联网科技公司
国外互联网科技网站
中国互联网有什么科技
江苏互联网科技小贷
全球科技与互联网公司市值变化
唯美互联网科技
求路客互联网科技电话