共計(jì) 2370 個(gè)字符,預(yù)計(jì)需要花費(fèi) 6 分鐘才能閱讀完成。
如何進(jìn)行 SQL 優(yōu)化中的 limit 分頁(yè)優(yōu)化,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
示例
表 aaaaa 中共有 2375690 數(shù)據(jù)。
優(yōu)化前的 SQL
SQL 執(zhí)行結(jié)果:
SELECT DISTINCT(device_id) uid FROM aaaaa WHERE status = 0 LIMIT 88000,1000;
1000 rows in set (0.48 sec)
SQL 執(zhí)行計(jì)劃:
MariaDB [star] explain SELECT sql_no_cache DISTINCT(device_id) uid FROM aaaaa WHERE status = 0 LIMIT 88000,1000;
+------+-------------+---------------+------+---------------+------+---------+------+---------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------------+------+---------------+------+---------+------+---------+------------------------------+
| 1 | SIMPLE | aaaaa | ALL | NULL | NULL | NULL | NULL | 2375690 | Using where; Using temporary |
+------+-------------+---------------+------+---------------+------+---------+------+---------+------------------------------+
優(yōu)化方式
迅速定位起始 ID,利用主鍵索引,加快掃描速度。可以看到,derived 中,SQL 使用到了覆蓋索引進(jìn)行掃描,雖然還是全表掃,因?yàn)橹粧呙?id 列,大大降低了掃描的 IO 耗費(fèi),快速定位到了 id。
MariaDB [star] explain SELECT sql_no_cache DISTINCT(device_id) uid FROM aaaaa join (select id from aaaaa limit 88000,1) k on star_device_5.id =k.id where status=0 limit 1000;
+------+-------------+---------------+-------+---------------+-------------+---------+------+---------+------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------------+-------+---------------+-------------+---------+------+---------+------------------------------------------------+
| 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 88001 | Using temporary |
| 1 | PRIMARY | star_device_5 | ALL | PRIMARY | NULL | NULL | NULL | 2377112 | Range checked for each record (index map: 0x1) |
| 2 | DERIVED | star_device_5 | index | NULL | idx_star_id | 8 | NULL | 2377112 | Using index |
+------+-------------+---------------+-------+---------------+-------------+---------+------+---------+------------------------------------------------+
執(zhí)行結(jié)果:
SELECT sql_no_cache DISTINCT(device_id) uid FROM star_device_5 join (select id from star_device_5 limit 880000,1) k on star_device_5.id =k.id where status=0 limit 1000;
1000 rows in set (0.19 sec)
隨著 m 的增大和 n 的增大,兩種寫(xiě)法的 SQL 執(zhí)行時(shí)間會(huì)有本質(zhì)差別。我做了測(cè)試,當(dāng) m 值增加到 880000 時(shí),優(yōu)化前的 SQL 需要 2 分鐘,優(yōu)化后的 SQL 還是 0.1s 左右。
看完上述內(nèi)容,你們掌握如何進(jìn)行 SQL 優(yōu)化中的 limit 分頁(yè)優(yōu)化的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!