❤️mysql索引失效的情况

小明的学习圈子2023-12-02数据库MySQL 优化

mysql索引失效的情况

  • 两表的关联字段类型不一致,导致索引失效。

可以用SHOW FULL COLUMNS FROM 表名查看表结构,主要看Collation这一列,如果俩表的关联的字段的排序规则不一致,会导致索引失效。

img

可以通过工具修改字符集和排序规则

img

  • 索引不会包含有NULL值的列,只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
  • 使用短索引,对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
  • 索引列排序,MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么orderby中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
  • like语句操作,一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like“%aaa%”不会使用索引而like“aaa%”可以使用索引。
  • 不要在列上进行运算,例如:select from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select from users where adddate<’2007-01-01′。关于这一点可以围观:一个单引号引发的MYSQL性能损失。
  • 不使用NOTIN、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
  • 索引要建立在经常进行select操作的字段上,这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
  • 索引要建立在值比较唯一的字段上
  • 对于那些定义为text、image和bit数据类型的列不应该增加索引,因为这些列的数据量要么相当大,要么取值很少。
  • where的查询条件里有不等号(wherecolumn!=…),mysql将无法使用索引
  • 如果where字句的查询条件里使用了函数(如:whereDAY(column)=…),mysql将无法使用索引
  • 在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用
  • MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。
  • or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
  • 组合索引,不是使用第一列索引,索引失效。
  • 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。比如 select id from table where name = “AA”
  • 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
  • 对索引字段进行计算操作、字段上使用函数。
Last Updated 2024/4/6 10:47:15