mysql技巧
以下內容來自于mysql經驗分享。
一、分頁sql的寫法
假設,一個公司產品有2000條記錄,要分頁取其中10個產品,假設訪
問公司索引需要50個IO,2條記錄需要1個表數據IO
在mysql中采用limit分頁
原理:一次性根據過濾條件取出所有字段進行排序返回
select * from t
where thread_id = 771025
and deleted = 0
order by gmt_create asc limit 0, 10;
數據訪問開銷=索引IO+索引全部記錄結果對應的表數據IO
該種寫法越翻到后面執行效率越差,時間越長,尤其表數據量很大的時候
或者可以更優化的,利用表的PK
原理:先根據過濾條件取出主鍵id進行排序,再進行join操作取出其他
相關字段//數據量大的時候,分頁時間是否越慢
select t.*from (
select id from t
where thread_id = 771025 and deleted = 0 order by gmt_create asc limit 0, 10) a, t
where a.id = t.id ?;
//假設t表主鍵是id列,且有覆蓋索引secondary key:thread_id+deleted+gmt_create
分頁SQL更多的是在業務上的優化。
二、多表關聯
驅動表(from的順序)
select a.*,b.*
from a,b ----這是錯誤的,b表作為驅動表
where a.id=b.id
and b.time>=‘xxxx’and b.time<=‘xxxx’and a.status=1;
驅動表(緊跟在from后面的表)原則是,結果集較小的表,而不是表較小的表
三、where的順序
select * from t where id=1 and type=1;
select * from t where type=1 and id=1;
兩種寫法相同,where是沒有順序的
四、其他
innodb表都需要有一個主鍵
單表行數不要超過一千萬,超過一千萬要提前分表;
多條insert拼接成一條提交可以極大提高效率,比如1000條拼成一條;多條相關的更新語句可以放在一個事務中;
轉載于:https://www.cnblogs.com/simonote/archive/2013/05/26/3100172.html
總結
- 上一篇: hdu1542
- 下一篇: 重构机房VB.NET机房收费系统个人重构