前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正确使用MySQL索引

正确使用MySQL索引

作者头像
星哥玩云
发布2022-08-16 14:47:18
1K0
发布2022-08-16 14:47:18
举报
文章被收录于专栏:开源部署

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也不能使用索引,相当于在判断列上加了函数一样。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档