阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

正确使用MySQL索引

129次阅读
没有评论

共计 1386 个字符,预计需要花费 4 分钟才能阅读完成。

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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计1386字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中