84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
数据表中,我建立了一个组合索引(a,b),然后使用如下查询
select a, b from TableA from a > 1000 and b = 2
在这种情况下,只能按照最左前缀使用索引,但b=2这个条件无法使用索引了, 这是为什么?
mysql5.6版本之前没有加入index condition pushdown,所以索引逻辑还是这样的:
即便对于复合索引,从第一列开始先确定第一列索引范围,如果范围带=号,则对于=号情况,确定第二列索引范围加入索引结果集里,每列的处理方式都是一样的。
确定完索引范围后,则回表查询数据,再用剩下的where条件进行过滤判断。
mysql5.6后加入了ICP,对于确定完了索引范围后,会用剩下的where条件对索引范围再进行一次过滤,然后再回表,再用剩下的where条件进行过滤判断。(减少回表记录数量)。
另外我估计楼主你的测试数据量应该不大,不然如果你确定的索引范围占总记录数的比例过大时,也是全表查询不走索引的。
应该你测试数据量太少了, 关心有没有用到索引没有意义.
放10w条数据再试试把
还有一个注意点:当MySQL一旦估计检查的行数可能会”太多”,范围查找优化将不会被使用。
select a, b from TableA from a > 1000 如果返回的行数太多,将不会使用索引。
mysql5.6版本之前没有加入index condition pushdown,所以索引逻辑还是这样的:
即便对于复合索引,从第一列开始先确定第一列索引范围,如果范围带=号,则对于=号情况,确定第二列索引范围加入索引结果集里,每列的处理方式都是一样的。
确定完索引范围后,则回表查询数据,再用剩下的where条件进行过滤判断。
mysql5.6后加入了ICP,对于确定完了索引范围后,会用剩下的where条件对索引范围再进行一次过滤,然后再回表,再用剩下的where条件进行过滤判断。(减少回表记录数量)。
另外我估计楼主你的测试数据量应该不大,不然如果你确定的索引范围占总记录数的比例过大时,也是全表查询不走索引的。
应该你测试数据量太少了, 关心有没有用到索引没有意义.
放10w条数据再试试把
还有一个注意点:
当MySQL一旦估计检查的行数可能会”太多”,范围查找优化将不会被使用。