mysql慢查詢優化之從理論和實踐說明limit的優點
阿新 • • 發佈:2020-01-09
很多時候, 我們預期查詢的結果最多是1條記錄資料, 那麼這個時候, 最好用上limit 1,當查到這條資料後, mysql會立即終止繼續查詢, 不進行更多的無用查詢, 從而提升了效率。
我們來實際測試一下, 在一個擁有10萬的mysql表中, 查詢lily的分數(假設系統中只有1個lily,而我們預期也只需要這條資料)。為了顯示出時間的差別, 我並不對錶的name欄位建索引。
先看看錶結構:
mysql> show create table tb_province; +-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_province | CREATE TABLE `tb_province` ( `id` bigint(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(32) NOT NULL,`score` int(10) unsigned DEFAULT '0',`x` int(10) unsigned DEFAULT '0',`x1` int(10) unsigned DEFAULT '0',`x2` int(10) unsigned DEFAULT '0',`x3` int(10) unsigned DEFAULT '0',`x4` int(10) unsigned DEFAULT '0',`x5` int(10) unsigned DEFAULT '0',`x6` int(10) unsigned DEFAULT '0',`x7` int(10) unsigned DEFAULT '0',`x8` int(10) unsigned DEFAULT '0',`x9` int(10) unsigned DEFAULT '0',`x10` int(10) unsigned DEFAULT '0',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=124178 DEFAULT CHARSET=latin1 | +-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
我們開啟set profiling=1;的開關,執行mysql語句來對比:
mysql> select score from tb_province where name='lily'; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.03 sec) mysql> select score from tb_province where name='lily'; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.03 sec) mysql> select score from tb_province where name='lily'; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.04 sec) mysql> select score from tb_province where name='lily'; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.02 sec) mysql> select score from tb_province where name='lily'; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.03 sec) mysql> select score from tb_province where name='lily' limit 1; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.00 sec) mysql> select score from tb_province where name='lily' limit 1; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.00 sec) mysql> select score from tb_province where name='lily' limit 1; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.00 sec) mysql> select score from tb_province where name='lily' limit 1; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.01 sec) mysql> select score from tb_province where name='lily' limit 1; +-------+ | score | +-------+ | 100 | +-------+ 1 row in set (0.00 sec)
可見,我們針對是否採用limit 1進行了5次對比測試, 來看看結果吧:
mysql> show profiles; +----------+------------+---------------------------------------------------------+ | Query_ID | Duration | Query | +----------+------------+---------------------------------------------------------+ | 5 | 0.02686000 | select score from tb_province where name='lily' | | 6 | 0.02649050 | select score from tb_province where name='lily' | | 7 | 0.03413500 | select score from tb_province where name='lily' | | 8 | 0.02601350 | select score from tb_province where name='lily' | | 9 | 0.02785775 | select score from tb_province where name='lily' | | 10 | 0.00042300 | select score from tb_province where name='lily' limit 1 | | 11 | 0.00043250 | select score from tb_province where name='lily' limit 1 | | 12 | 0.00044350 | select score from tb_province where name='lily' limit 1 | | 13 | 0.00053200 | select score from tb_province where name='lily' limit 1 | | 14 | 0.00043250 | select score from tb_province where name='lily' limit 1 | +----------+------------+---------------------------------------------------------+ 14 rows in set,1 warning (0.00 sec)
可見,採用limit 1後, mysql語句的效率確實提升很多。 當表更大時, 效率提升會更加明顯。
我們已經從理論和實踐的指令碼都說明了limit的優點, 所以, 建議是:在可用limit的時候要用limit (當然, 如果結果是多個,肯定不能limit 1啊)
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結