我有一个名为'emp‘的表,其中列有emp_id (主键)、名称、道布、电子邮件,有500万行。以下查询使用完整索引扫描。
select emp.emp_id from emp limit 2500000, 100000;MySQL计划:


为什么mysql不能执行范围扫描,而对4548 256行执行全索引扫描?
发布于 2021-06-20 01:35:02
想一想电话簿。如果我让您按姓名查找一个人,电话簿的本质是一个排序列表,因此您可以很快找到该姓名。
但是,如果我要求您查找电话簿中的第25,000个人,这是一个排序列表的事实对您没有帮助。你必须从这本书的开头开始数,直到数到25000。
按名称搜索是一种查找,可以查找特定名称,也可以查找一系列名称。但重要的是,这是按值搜索,而不是按条目的位置搜索。
LIMIT查询不是按值查找,而是按位置查找。索引对此无济于事。要获得查询结果,MySQL必须从表的第一行开始计算所有行。
要使您的查询进行范围扫描,必须按值进行搜索:
SELECT emp.emp_id FROM emp WHERE emp.emp_id BETWEEN 2500000 AND 2600000;但这与您的LIMIT查询并不完全相同,因为emp_id中的值可能有间隙,而不是使用每个整数值。
https://stackoverflow.com/questions/68049033
复制相似问题