数据库索引使用的优化

索引的选择

B-tree

特点:

  • B-tree索引用B+tree实现,
  • 适合范围查找
  • 适合精确查找

使用注意

创建索引(user_name,user_num,city)。

  • 全值匹配,查询条件包括user_name、user_num、city全部条件。
  • 最左匹配,有限匹配最左索引列,上述所以可以匹配(user_name)、(user_name,user_num)、(user_name,user_num,city)这样的查询条件,但是如果我们使用(user_num,city)则无法使用用索引。如果使用(user_name,city)查询条件,则只会使用user_name索引,这就是最左匹配原则。
  • 可匹配列前缀,例如:user_name like ‘li%’.
  • 可用作范围查询,例如(user_name= ‘li’ and user_num > 20)
  • 联合索引,建立索引时,经常使用的列优先,辨识度高的索引放前边,长度小的优先。
  • 如果可以使用联合索引,可以减少磁盘io
  • 不要建立过多的索引,这样会影响mysql的写入和更新,尽量扩展建立联合索引,不要增加索引。
  • 如何可以使用前缀索引。

无法使用索引的情况

  • 无最左匹配列的情况,例如(user_num,city)这样的查询条件。
  • 使用列列后缀匹配,例如user_name like ‘%jian’
  • 如果某一列使用范围查询,则后续列无法继续使用索引。例如 user_name = ‘lijian’ and user_num > 20 and city = ‘郑州’,city 列是无法使用索引的。
  • 查询时,不要对索引使用函数 例如:SELECT * FROM user_test WHERE user_name = concat(user_name, 'fei')
  • 索引不参与计算,如果索引列参与计算不走索引
  • 字符串与数字比较不走索引。

mysql不支持hash索引

贴上一份官方文档:
mysql官方介绍inndb

image

很明显,mysql是不支持hash索引的。innodb内部会根据表的使用支持自适应hash索引优化,所以无法认为建立。
当然建表语句还是有的,如下。
查看一下表的建表语句:
image
这个时候可以发现,建立语句里还是有hash的。

但是执行show index from cm_deposit_order可以返现其实使用hash的索引还是Btree.

image