t表有id a b三列
a 和 b列都有索引,且有10w行,每行的值都是相同的(1,1,1) (2,2,2) ....(100000,100000,100000)
CREATE TABLE t
(id
int(11) NOT NULL,a
int(11) NOT NULL,b
int(11) NOT NULL,
PRIMARY KEY (·id·),
KEY 'a'('a'),
KEY 'b'('b')
)ENGINE=InnoDB;
select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 1.
select from (select from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 100) alias limit 1;
第一条使用的是索引B,原因是优化器认为使用索引b可以避免排序(b本身是索引,已经是有序的了,如果选择索引b的话,不需要再做排序,只需要遍历),所及即使扫描行数多,也判定为代价更小;
上面的说法没问题,但是第二条SQL使用limit 100让优化器意识到,使用b索引代价是很高的,根据数据特征诱导了一下优化器,请问为什么这样能诱导到优化器呢?
在极客时间的MySQL45讲的第10讲中,你提到的两个SQL语句可能会让优化器选择不同的索引。这是因为不同的索引有不同的性能影响。索引可以加速查询,但也会占用更多的存储空间。
如果你正在选择一个索引,而另一个索引对查询性能影响较小,那么使用另一个索引可能会更有效。然而,如果两个索引都对查询性能有很大影响,那么使用其中一个索引可能更好。
在MySQL中,索引分为以下几类:
B-Tree索引:这种索引是MySQL中最常见的索引类型,用于存储大型数据集。B-Tree索引允许MySQL在常数时间内搜索和访问数据,因此对于大型数据集,B-Tree索引通常比其他类型的索引更有效。
Bitmap索引:这种索引使用位数组来表示每个列,可以提供快速的全文搜索和条件查询。
Hash索引:这种索引将值映射到一个唯一的索引键,可以提供快速的插入、删除和查找操作。
Full-text索引:这种索引是MySQL中用于处理文本数据的一种特殊类型的索引。它使用多维的文本数据结构来存储文本查询结果。
总的来说,你需要根据你的查询需求来选择合适的索引类型。如果你正在处理大型数据集,或者需要频繁地进行全文搜索和条件查询,那么B-Tree或Bitmap索引可能是更好的选择。然而,如果你的查询中包含大量的数字,那么使用Hash索引可能更有效。
在极客时间的MySQL45讲的第10讲中,你提到的两个SQL语句可能会让优化器选择不同的索引。这是因为不同的索引有不同的性能影响。索引可以加速查询,但也会占用更多的存储空间。
如果你正在选择一个索引,而另一个索引对查询性能影响较小,那么使用另一个索引可能会更有效。然而,如果两个索引都对查询性能有很大影响,那么使用其中一个索引可能更好。
在MySQL中,索引分为以下几类:
B-Tree索引:这种索引是MySQL中最常见的索引类型,用于存储大型数据集。B-Tree索引允许MySQL在常数时间内搜索和访问数据,因此对于大型数据集,B-Tree索引通常比其他类型的索引更有效。
Bitmap索引:这种索引使用位数组来表示每个列,可以提供快速的全文搜索和条件查询。
Hash索引:这种索引将值映射到一个唯一的索引键,可以提供快速的插入、删除和查找操作。
Full-text索引:这种索引是MySQL中用于处理文本数据的一种特殊类型的索引。它使用多维的文本数据结构来存储文本查询结果。
总的来说,你需要根据你的查询需求来选择合适的索引类型。如果你正在处理大型数据集,或者需要频繁地进行全文搜索和条件查询,那么B-Tree或Bitmap索引可能是更好的选择。然而,如果你的查询中包含大量的数字,那么使用Hash索引可能更有效。