我有一個(gè)名為“emp”的表,其中有emp_id(主鍵)、name、dob、email列,共有500萬(wàn)行。以下查詢使用完全索引掃描。
select emp.emp_id from emp limit 2500000, 100000;
MySQL plan:
為什么mysql不能執(zhí)行范圍掃描,它對(duì)4548256行執(zhí)行完全索引掃描?
我有一個(gè)名為“emp”的表,其中有emp_id(主鍵)、name、dob、email列,共有500萬(wàn)行。以下查詢使用完全索引掃描。
select emp.emp_id from emp limit 2500000, 100000;
MySQL plan:
為什么mysql不能執(zhí)行范圍掃描,它對(duì)4548256行執(zhí)行完全索引掃描?
公眾號(hào):1024技術(shù)圈
?? 提供互聯(lián)網(wǎng)知識(shí)和資訊,分享IT前沿技術(shù),熱門資源,大廠面試題 ??
想想電話簿。如果我讓你按名字找一個(gè)人,電話簿的性質(zhì)是一個(gè)分類列表,所以你可以很快找到他的名字。
但是,如果我讓你在電話簿上找到第25000個(gè)人,事實(shí)上,這是一個(gè)排序列表對(duì)你沒(méi)有幫助。你必須從書的開頭開始數(shù)到25000。
按名稱搜索是一種查找,可以查找特定名稱,也可以查找一系列名稱。但重要的是,這是按值搜索,而不是按條目的位置搜索。
LIMIT
查詢不是按值查找,而是按位置查找。索引對(duì)此沒(méi)有幫助。為了得到查詢結(jié)果,MySQL必須從表的第一行開始計(jì)算所有行。要使查詢成為范圍掃描,它必須按值搜索:
但這與LIMIT查詢不完全相同,因?yàn)?code>emp_id中的值可能有間隙,而不是使用每個(gè)整數(shù)值。