首页 > 代码库 > 高性能mysql 第5章 创建高可用的索引

高性能mysql 第5章 创建高可用的索引

一定程度上说,mysql只有b-tree索引。他没有bitmap索引。还有一个叫hash索引的,只在Memory存储引擎中才有。

b-tree索引跟oracle中的大同小异。

mysql中关于b-tree的限制:

只有做全值拼配或者根据左前缀匹配。我猜测是因为mysql没有基于cost的优化器,它没有对index full scan的操作。因为无法衡量这种full scan是否划得来。所以只能对前缀进行匹配,没有后缀或者中间匹配这种逻辑。

 

如果是多列索引,顺序很重要,如果没有从索引的第一列开始查询,那么将不会使用索引。

比如索引建立在A,B,C列上。

  • 如果对B= ? and C = ? 无法使用索引
  • 如果对 A = ? and C = ? 只能A =?生效 使用索引。

 

始终将索引的列放在查询的一边,如A + 1 = 2,这种情况不会使用索引,应该是写A = 1。(可能是因为mysql处理的时候,A + 1 是作为隐藏的函数来处理的)。A如果作为函数的参数,也无法使用索引。

 

前缀索引:

前缀索引用在大字段上或者长度比较尝的字符串上,使用字符串的前缀作为索引。传入一个参数,代表截取的长度。

语法:

  1. create index idx_t_test_c_char1 on t_test(c_char(3)); create index idx_t_test_c_char1 on t_test(c_char(3));
  2. explain select * from t_test t where t.c_char = ‘12455‘

 

结果:

技术分享

使用了索引。

前缀索引的缺陷:因为只存储了前缀,所以无法作为数据来操作,如order by和group by的部分,无法使用这个索引来优化。

高性能mysql 第5章 创建高可用的索引