数据不均匀分布时索引也是有用的

Categories:

2023年了,大多数程序员对数据库、对索引的认识都越来越深了。
不像以前,性能慢二话不说上来就是一个索引。
若一个表里如状态字段只有几种状态时,如果该字段包含的状态值分布均匀,那么不建议对该状态字段创建索引,因为索引会增加查询时间和存储成本。

但是,如果该状态字段中某些状态值占比较大,而其他状态值相对较少,并且需要查询的只是少部分的这些状态,那么为该状态字段建立索引也是可以显著提高查询性能。

某日看到一条慢sql,

SELECT * FROM `table_demo` where 
abc='100600'
 or abc like '%100600%'
 or abc like '%100600,%'
 or abc like '%,100600%' )

存在前后%的like,显然索引是不会生效的。
分析了下表里的实际存储情况,发现表里总共只有几百万数据,但是几百万全是null。
只有不到1万的数据里abc有值。
于是我尝试给他加了abc is not null试试,果然执行计划里从all变成了range
加了条件后,利用索引直接把那几百万的null数据过滤掉了,like逐行比较只需要比较不到1万的记录,性能一下就上来了。

SELECT * FROM `table_demo` where abc is not null 
and (abc='100600'
 or abc like '%100600%'
 or abc like '%100600,%'
 or abc like '%,100600%' )

如果你觉得本文对你有帮助或不错,可略表心意,请我喝一杯冰可乐。

Comments