一.使用索引覆蓋掃描
如果我們只需要查詢部分字段,而不是所有字段,我們可以嘗試使用索引覆蓋掃描,也就是讓查詢所需的所有字段都在索引中,這樣就不需要再訪問數據頁,減少了隨機 I/O 操作。
例如,如果我們只需要查詢 id 和 val 字段,我們可以執行以下語句:
select id,val from test where val=4 limit 300000,5;
這樣,Mysql 只需要掃描索引頁,而不需要訪問數據頁,提高了查詢效率。
二.使用子查詢。
如果我們不能使用索引覆蓋掃描,或者查詢字段較多,我們可以嘗試使用子查詢,也就是先用一個子查詢找出我們需要的記錄的 id 值,然后再用一個主查詢根據 id 值獲取其他字段。
例如,我們可以執行以下語句:
select * from test where id in (select id from test where val=4 limit 300000,5);
這樣,Mysql 先執行子查詢,在 val 索引上進行范圍掃描,并返回 5 個 id 值。然后,Mysql 再執行主查詢,在 id 索引上進行點查找,并返回所有字段。這樣,Mysql 只需要掃描 5 個數據頁,而不是 300005 個數據頁,提高了查詢效率。
三.使用分區表。
如果我們的表非常大,或者數據分布不均勻,我們可以嘗試使用分區表,也就是將一張大表分成多個小表,并按照某個字段或者范圍進行劃分。這樣,Mysql 可以根據條件只訪問部分分區表,而不是整張表,減少了掃描和訪問的數據量。
例如,如果我們按照 val 字段將 test 表分成 10 個分區表(test_1 到 test_10),每個分區表只存儲 val 等于某個值的記錄,我們可以執行以下語句:
這樣,Mysql 只需要訪問 test_4 這個分區表,而不需要訪問其他分區表,提高了查詢效率。