mysql技巧
以下內(nèi)容來(lái)自于mysql經(jīng)驗(yàn)分享。
一、分頁(yè)sql的寫法
假設(shè),一個(gè)公司產(chǎn)品有2000條記錄,要分頁(yè)取其中10個(gè)產(chǎn)品,假設(shè)訪
問公司索引需要50個(gè)IO,2條記錄需要1個(gè)表數(shù)據(jù)IO
在mysql中采用limit分頁(yè)
原理:一次性根據(jù)過濾條件取出所有字段進(jìn)行排序返回
select * from t
where thread_id = 771025
and deleted = 0
order by gmt_create asc limit 0, 10;
數(shù)據(jù)訪問開銷=索引IO+索引全部記錄結(jié)果對(duì)應(yīng)的表數(shù)據(jù)IO
該種寫法越翻到后面執(zhí)行效率越差,時(shí)間越長(zhǎng),尤其表數(shù)據(jù)量很大的時(shí)候
或者可以更優(yōu)化的,利用表的PK
原理:先根據(jù)過濾條件取出主鍵id進(jìn)行排序,再進(jìn)行join操作取出其他
相關(guān)字段//數(shù)據(jù)量大的時(shí)候,分頁(yè)時(shí)間是否越慢
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 ?;
//假設(shè)t表主鍵是id列,且有覆蓋索引secondary key:thread_id+deleted+gmt_create
分頁(yè)SQL更多的是在業(yè)務(wù)上的優(yōu)化。
二、多表關(guān)聯(lián)
驅(qū)動(dòng)表(from的順序)
select a.*,b.*
from a,b ----這是錯(cuò)誤的,b表作為驅(qū)動(dòng)表
where a.id=b.id
and b.time>=‘xxxx’and b.time<=‘xxxx’and a.status=1;
驅(qū)動(dòng)表(緊跟在from后面的表)原則是,結(jié)果集較小的表,而不是表較小的表
三、where的順序
select * from t where id=1 and type=1;
select * from t where type=1 and id=1;
兩種寫法相同,where是沒有順序的
四、其他
innodb表都需要有一個(gè)主鍵
單表行數(shù)不要超過一千萬(wàn),超過一千萬(wàn)要提前分表;
多條insert拼接成一條提交可以極大提高效率,比如1000條拼成一條;多條相關(guān)的更新語(yǔ)句可以放在一個(gè)事務(wù)中;
轉(zhuǎn)載于:https://www.cnblogs.com/simonote/archive/2013/05/26/3100172.html
總結(jié)
- 上一篇: hdu1542
- 下一篇: linux cmake编译源码,linu