索引?
索引包含一个或多个列的值。MySql只能高效的利用索引的最左前缀列。索引的优势:
-
减少查询扫描的数据量
-
避免排序和零时表
-
将随机IO变为顺序IO (顺序IO的效率高于随机IO)
B-Tree使用最多的索引类型。采用B-Tree数据结构来存储数据(每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的遍历)。B-Tree索引适用于全键值,键值范围,键前缀查找,支持排序。B-Tree索引限制:
-
如果不是按照索引的最左列开始查询,则无法使用索引。
-
不能跳过索引中的列。如果使用第一列和第三列索引,则只能使用第一列索引。
-
如果查询中有个范围查询,则其右边的所有列都无法使用索引优化查询。
哈希索引只有精确匹配索引的所有列,查询才有效。存储引擎会对所有的索引列计算一个哈希码,哈希索引将所有的哈希码存储在索引中,并保存指向每个数据行的指针。题精选哈希索引限制:
-
无法用于排序
-
不支持部分匹配
-
只支持等值查询如=,IN(),不支持 < >
优化建议点
-
注意每种索引的适用范围和适用限制。
-
索引的列如果是表达式的一部分或者是函数的参数,则失效。
-
针对特别长的字符串,可以使用前缀索引,根据索引的选择性选择合适的前缀长度。
-
使用多列索引的时候,可以通过 AND 和 OR 语法连接。
-
重复索引没必要,如(A,B)和(A)重复。
-
索引在where条件查询和group by语法查询的时候特别有效。
-
将范围查询放在条件查询的最后,防止范围查询导致的右边索引失效的问题。
-
索引最好不要选择过长的字符串,而且索引列也不宜为null。
Java Program!