之前寫的SQL查詢語(yǔ)句根本沒(méi)有考慮到性能方面的問(wèn)題画饥,一是自己沒(méi)有經(jīng)驗(yàn)蚂斤,二是因?yàn)榫W(wǎng)站規(guī)模小數(shù)據(jù)量不大,自然感受不到查詢帶來(lái)的性能問(wèn)題畔派。
最近由于數(shù)據(jù)量開(kāi)始真大铅碍,在大后臺(tái)一個(gè)產(chǎn)品列表的頁(yè)面卡住了好久。最近也在閱讀《高性能MYSQL》线椰,就覺(jué)得將查詢的語(yǔ)句優(yōu)化下胞谈。廢話結(jié)束。
-
傳統(tǒng)分頁(yè):
- SELECT * FROM table LIMIT 100000,10
-
LIMIT的原理:
- LIMIT 偏移量憨愉,條數(shù)
- 當(dāng)偏移量越大烦绳,速度越慢。
-
推薦方法:
- SELECT * FROM table WHERE id>=100000 LIMIT 11 #10+1 (每頁(yè)10條);
- SELECT * FROM table INNER JOIN (SELECT id FROM table LIMIT 100000,10) AS t USING(id);
- SELECT * FROM table WHERE id>=(SELECT id FROM table LIMIT 100000,1) LIMIT 10;
- SELECT id FROM table LIMIT 100000,10;
SELECT * FROM table WHERE id IN(100,101...,110);
-
其他:
- 盡量不用SELECT * 配紫,只取需要數(shù)據(jù)列
- 更安全的設(shè)計(jì):減少表變化帶來(lái)的影響
- 為使用covering index提供可能性
- Select/JOIN減少硬盤臨時(shí)表生成径密,特別是有TEXT/BLOB時(shí)
- 盡量不用SELECT * 配紫,只取需要數(shù)據(jù)列
參考:
0.MySQL數(shù)據(jù)庫(kù)開(kāi)發(fā)的三十六條軍規(guī)石展完整.pdf
1.**mysql LIMIT 子句用法及原理 **