数据库-索引的使用优化
数据库索引使用的优化
索引的选择
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
很明显,mysql是不支持hash索引的。innodb内部会根据表的使用支持自适应hash索引优化,所以无法认为建立。
当然建表语句还是有的,如下。
查看一下表的建表语句:
这个时候可以发现,建立语句里还是有hash的。
但是执行show index from cm_deposit_order
可以返现其实使用hash的索引还是Btree.