LIMIT In MYSQL 使用全索引扫描而不是范围扫描
LIMIT In MYSQL uses full index scan and not range scan
我有一个名为 'emp' 的 table,包含列 emp_id(主键)、姓名、出生日期、电子邮件,有 500 万行。以下查询使用全索引扫描。
select emp.emp_id from emp limit 2500000, 100000;
MySQL计划:
为什么mysql不能执行范围扫描,它对4 548 256行执行全索引扫描?
想想电话簿。如果我让你按名字找人,电话簿的本质是一个排序列表,所以你可以很快找到名字。
但是如果我要求你在电话簿中找到第 25,000 个人,那么它是一个排序列表这一事实对你没有帮助。您必须从书的开头开始数,直到达到 25,000。
按名称搜索是查找特定名称或名称范围。但重要的是这是按值搜索,而不是按条目位置搜索。
LIMIT
查询不是按值查找,而是按位置查找。该索引无助于此。要获得查询结果,MySQL 必须从 table.
的第一行开始计算所有行
要使您的查询成为范围扫描,它必须按值搜索:
SELECT emp.emp_id FROM emp WHERE emp.emp_id BETWEEN 2500000 AND 2600000;
但这与您的 LIMIT 查询并不完全相同,因为 emp_id
中的值可能存在间隙,而不是使用每个整数值。
我有一个名为 'emp' 的 table,包含列 emp_id(主键)、姓名、出生日期、电子邮件,有 500 万行。以下查询使用全索引扫描。
select emp.emp_id from emp limit 2500000, 100000;
MySQL计划:
为什么mysql不能执行范围扫描,它对4 548 256行执行全索引扫描?
想想电话簿。如果我让你按名字找人,电话簿的本质是一个排序列表,所以你可以很快找到名字。
但是如果我要求你在电话簿中找到第 25,000 个人,那么它是一个排序列表这一事实对你没有帮助。您必须从书的开头开始数,直到达到 25,000。
按名称搜索是查找特定名称或名称范围。但重要的是这是按值搜索,而不是按条目位置搜索。
LIMIT
查询不是按值查找,而是按位置查找。该索引无助于此。要获得查询结果,MySQL 必须从 table.
要使您的查询成为范围扫描,它必须按值搜索:
SELECT emp.emp_id FROM emp WHERE emp.emp_id BETWEEN 2500000 AND 2600000;
但这与您的 LIMIT 查询并不完全相同,因为 emp_id
中的值可能存在间隙,而不是使用每个整数值。