正确使用索引
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,MySQL之所以能够高效的检索数据,可以说全赖索引之功。在索引使用过程中,要注意一下几点。1、MySQL在使用索引时候,采用的是最左匹配原则。如果是单列索引,则很容易理解,若是多列索引,例如idx_a
千家信息网最后更新 2025年11月08日正确使用索引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安全错误
数据库的锁怎样保障安全
修改sql数据库实例名
高校网络安全年度总结
服务器 消息推送
服务器安全隐患怎么查
数据库上传到服务器软件
微信提示服务器错误怎么办
计算机网络安全技术第六版
网络安全弱点测试程序
嵩县软件开发
上海共享充电宝软件开发公司
江苏数据网络技术服务费
网络技术专接本有哪些
对峙二选哪个地方的服务器好
练枪地图找不到服务器是怎么回事
医院数据库的安全管理
怎么还原sql数据库
摸清家底 网络安全宣传周
天津途致臻网络技术贴吧
苏州物豆互联网科技
服务器nacos自动关闭
违法网络安全法第46条规定
学校sci数据库不完善
南京如初网络技术有限公司
软件开发行业存货周转率
网络安全的涉及范围
网络安全大赛都是大学生吗
数据库employee表练习
福州唐龙网络技术
百度rk3588服务器
服务器管理仪表盘开机关闭