数据库索引

  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 组合索引:则列值的组合必须唯一
  • 主键索引:特殊的唯一索引,不允许有空值

组合索引例子:

1
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);

建表时usernname长度为16,这里用10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

相当于分别建立了下面三组组合MySQL数据库索引:

【usernname,city,age】【usernname,city】【usernname】

为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引

什么样的查询会使用索引

  • 当在建立了索引的列上使用精确匹配,使用“=”或者“in”时是会使用索引的。
  • 最左匹配原则,在a和b上建立了联合索引,where b = ?时是不会使用索引的。
  • 通配符%不能放在开头,也就是说,like %abc%是不会使用索引的,like abc%是会使用索引的。
  • 范围列(>,<,between and)可以用到索引,但是范围列后面的列无法用到索引。同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引。
  • 如果使用了函数或者表达式,则不会使用索引。例如,left(title, 6)=’Senior’将不会使用到索引,可以使用like代替。
  • group by的优化需要松散索引扫描和紧凑索引扫描。

索引优化

  • 索引要建立在数值分布均匀的列上,如果在性别,只有男和女2个取值的列上建立索引,对于查询速度的提升不会有很大帮助。
  • 另一种与索引选择有关的优化策略叫做前缀索引,就是用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引key变短而减少了索引文件的大小和维护开销。
1
ALTER TABLE employees.employeesADD INDEX `first_name_last_name4` (first_name, last_name(4));
  • 当你删除数据时,MySQL并不会回收,已被删除数据占据的存储空间,以及索引位。而是空在那里,而是等待新的数据来弥补这个空缺。
  • 如果一时半会,没有数据来填补这个空缺,那这样就太浪费资源了。所以对于写操作比较频烦的表,要定期进行optimize,比如一个月一次。