正确使用索引
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,MySQL之所以能够高效的检索数据,可以说全赖索引之功。在索引使用过程中,要注意一下几点。1、MySQL在使用索引时候,采用的是最左匹配原则。如果是单列索引,则很容易理解,若是多列索引,例如idx_a
千家信息网最后更新 2024年09月22日正确使用索引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安全错误
数据库的锁怎样保障安全
哪个英文数据库有中文
大学生维护网络安全两会
我的世界服务器骑士
服务器 linux比例
软件开发在西安有哪些部门
托管服务器换新ip和网关
网络安全就是防火墙
网络技术费的分录
asp数据库中的信息
嘉定图腾服务器机柜价格
风味数据库的建立
数据库的六大对象的实训步骤
新乡网络安全工程师报名
网络安全班会课小学生心得体会
服务器安全狗+设置
润益互联网科技有限公司
360手机系统服务器关闭
服务器开机输入管理员密码
软件开发者信息在哪里
海淀区网络安全进展
静安区软件开发技术
网络安全吗 双网卡
下一代计算机网络技术有什么特点
vb sql 数据库
软件开发微服务架构
云服务器实现
梦幻西游广东4区有哪些服务器
网络安全知识法律法规
软件开发买mac
检查服务器超级管理员用户