一定程度上说,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如果作为函数的参数,也无法使用索引。
前缀索引:
前缀索引用在大字段上或者长度比较尝的字符串上,使用字符串的前缀作为索引。传入一个参数,代表截取的长度。
语法:
- 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)); - explain select * from t_test t where t.c_char = ‘12455‘
结果:
使用了索引。
前缀索引的缺陷:因为只存储了前缀,所以无法作为数据来操作,如order by和group by的部分,无法使用这个索引来优化。
时间: 2024-11-08 11:50:18