MySQL建表規(guī)范與常見(jiàn)問(wèn)題

一幕垦、 表設(shè)計(jì)
庫(kù)名、表名傅联、字段名必須使用小寫(xiě)字母先改,“_”分割。
庫(kù)名蒸走、表名仇奶、字段名必須不超過(guò)12個(gè)字符。
庫(kù)名比驻、表名该溯、字段名見(jiàn)名知意,建議使用名詞而不是動(dòng)詞。
建議使用InnoDB存儲(chǔ)引擎别惦。
存儲(chǔ)精確浮點(diǎn)數(shù)必須使用DECIMAL替代FLOAT和DOUBLE朗伶。
建議使用UNSIGNED存儲(chǔ)非負(fù)數(shù)值。
建議使用INT UNSIGNED存儲(chǔ)IPV4步咪。
整形定義中不添加長(zhǎng)度论皆,比如使用INT,而不是INT(4)。
使用短數(shù)據(jù)類(lèi)型点晴,比如取值范圍為0-80時(shí)感凤,使用TINYINT UNSIGNED。
不建議使用ENUM類(lèi)型粒督,使用TINYINT來(lái)代替陪竿。
盡可能不使用TEXT、BLOB類(lèi)型屠橄。
VARCHAR(N)族跛,N表示的是字符數(shù)不是字節(jié)數(shù),比如VARCHAR(255)锐墙,可以最大可存儲(chǔ)255個(gè)漢字礁哄,需要根據(jù)實(shí)際的寬度來(lái)選擇N。
VARCHAR(N)溪北,N盡可能小桐绒,因?yàn)镸ySQL一個(gè)表中所有的VARCHAR字段最大長(zhǎng)度是65535個(gè)字節(jié),進(jìn)行排序和創(chuàng)建臨時(shí)表一類(lèi)的內(nèi)存操作時(shí)之拨,會(huì)使用N的長(zhǎng)度申請(qǐng)內(nèi)存茉继。
表字符集選擇UTF8。
使用VARBINARY存儲(chǔ)變長(zhǎng)字符串蚀乔。
存儲(chǔ)年使用YEAR類(lèi)型烁竭。
存儲(chǔ)日期使用DATE類(lèi)型。
存儲(chǔ)時(shí)間(精確到秒)建議使用TIMESTAMP類(lèi)型吉挣,因?yàn)門(mén)IMESTAMP使用4字節(jié)颖变,DATETIME使用8個(gè)字節(jié)。
建議字段定義為NOT NULL听想。
將過(guò)大字段拆分到其他表中腥刹。
禁止在數(shù)據(jù)庫(kù)中使用VARBINARY、BLOB存儲(chǔ)圖片汉买、文件等衔峰。
表結(jié)構(gòu)變更需要通知DBA審核。

二蛙粘、 索引
非唯一索引必須按照“idx_字段名稱字段名稱[字段名]”進(jìn)行命名垫卤。
唯一索引必須按照“uniq_字段名稱字段名稱[字段名]”進(jìn)行命名。
索引名稱必須使用小寫(xiě)出牧。
索引中的字段數(shù)建議不超過(guò)5個(gè)穴肘。
單張表的索引數(shù)量控制在5個(gè)以內(nèi)。
唯一鍵由3個(gè)以下字段組成舔痕,并且字段都是整形時(shí)评抚,使用唯一鍵作為主鍵豹缀。
沒(méi)有唯一鍵或者唯一鍵不符合5中的條件時(shí),使用自增(或者通過(guò)發(fā)號(hào)器獲瓤)id作為主鍵邢笙。
唯一鍵不和主鍵重復(fù)。
索引字段的順序需要考慮字段值去重之后的個(gè)數(shù)侍匙,個(gè)數(shù)多的放在前面氮惯。
ORDER BY,GROUP BY想暗,DISTINCT的字段需要添加在索引的后面妇汗。
使用EXPLAIN判斷SQL語(yǔ)句是否合理使用索引,盡量避免extra列出現(xiàn):Using File Sort说莫,UsingTemporary杨箭。
UPDATE、DELETE語(yǔ)句需要根據(jù)WHERE條件添加索引唬滑。
不建議使用%前綴模糊查詢告唆,例如LIKE “%weibo”棺弊。
對(duì)長(zhǎng)度過(guò)長(zhǎng)的VARCHAR字段建立索引時(shí)晶密,添加crc32或者M(jìn)D5 Hash字段,對(duì)Hash字段建立索引模她。
合理創(chuàng)建聯(lián)合索引(避免冗余)稻艰,(a,b,c) 相當(dāng)于 (a) 、(a,b) 侈净、(a,b,c)尊勿。
合理利用覆蓋索引。
SQL變更需要確認(rèn)索引是否需要變更并通知DBA畜侦。

三元扔、 SQL語(yǔ)句
使用prepared statement,可以提供性能并且避免SQL注入旋膳。
SQL語(yǔ)句中IN包含的值不應(yīng)過(guò)多澎语。
UPDATE、DELETE語(yǔ)句不使用LIMIT验懊。
WHERE條件中必須使用合適的類(lèi)型擅羞,避免MySQL進(jìn)行隱式類(lèi)型轉(zhuǎn)化。
SELECT語(yǔ)句只獲取需要的字段义图。
SELECT减俏、INSERT語(yǔ)句必須顯式的指明字段名稱,不使用SELECT 碱工,不使用INSERTINTO table()娃承。
使 用SELECT column_name1, column_name2 FROM table WHERE[condition]而不是SELECT column_name1 FROM table WHERE[condition]和SELECT column_name2 FROM table WHERE [condition]奏夫。
WHERE條件中的非等值條件(IN、BETWEEN草慧、<桶蛔、<=、>漫谷、>=)會(huì)導(dǎo)致后面的條件使用不了索引仔雷。
避免在SQL語(yǔ)句進(jìn)行數(shù)學(xué)運(yùn)算或者函數(shù)運(yùn)算,容易將業(yè)務(wù)邏輯和DB耦合在一起舔示。
INSERT語(yǔ)句使用batch提交(INSERT INTO tableVALUES(),(),()……)碟婆,values的個(gè)數(shù)不應(yīng)過(guò)多。
避免使用存儲(chǔ)過(guò)程惕稻、觸發(fā)器竖共、函數(shù)等,容易將業(yè)務(wù)邏輯和DB耦合在一起俺祠,并且MySQL的存儲(chǔ)過(guò)程公给、觸發(fā)器、函數(shù)中存在一定的bug蜘渣。
避免使用JOIN淌铐。
使用合理的SQL語(yǔ)句減少與數(shù)據(jù)庫(kù)的交互次數(shù)。
不使用ORDER BY RAND()蔫缸,使用其他方法替換腿准。
建議使用合理的分頁(yè)方式以提高分頁(yè)的效率。
統(tǒng)計(jì)表中記錄數(shù)時(shí)使用COUNT(
)拾碌,而不是COUNT(primary_key)和COUNT(1)吐葱。
禁止在從庫(kù)上執(zhí)行后臺(tái)管理和統(tǒng)計(jì)類(lèi)型功能的QUERY。

四校翔、 散表
每張表數(shù)據(jù)量建議控制在5000w以下弟跑。
可以結(jié)合使用hash、range防症、lookup table進(jìn)行散表孟辑。
散表如果使用md5(或者類(lèi)似的hash算法)進(jìn)行散表,表名后綴使用16進(jìn)制告希,比如user_ff扑浸。
推薦使用CRC32求余(或者類(lèi)似的算術(shù)算法)進(jìn)行散表,表名后綴使用數(shù)字燕偶,數(shù)字必須從0開(kāi)始并等寬喝噪,比如散100張表,后綴從00-99指么。
使用時(shí)間散表酝惧,表名后綴必須使用特定格式榴鼎,比如按日散表user_20110209、按月散表user_201102晚唇。

五巫财、 其他
批量導(dǎo)入、導(dǎo)出數(shù)據(jù)需要DBA進(jìn)行審查哩陕,并在執(zhí)行過(guò)程中觀察服務(wù)平项。
批量更新數(shù)據(jù),如update,delete 操作悍及,需要DBA進(jìn)行審查闽瓢,并在執(zhí)行過(guò)程中觀察服務(wù)。
產(chǎn)品出現(xiàn)非數(shù)據(jù)庫(kù)平臺(tái)運(yùn)維導(dǎo)致的問(wèn)題和故障時(shí)心赶,如前端被抓站扣讼,請(qǐng)及時(shí)通知DBA,便于維護(hù)服務(wù)穩(wěn)定缨叫。
業(yè)務(wù)部門(mén)程序出現(xiàn)bug等影響數(shù)據(jù)庫(kù)服務(wù)的問(wèn)題,請(qǐng)及時(shí)通知DBA椭符,便于維護(hù)服務(wù)穩(wěn)定。
業(yè)務(wù)部門(mén)推廣活動(dòng)耻姥,請(qǐng)?zhí)崆巴ㄖ狣BA進(jìn)行服務(wù)和訪問(wèn)評(píng)估销钝。
如果出現(xiàn)業(yè)務(wù)部門(mén)人為誤操作導(dǎo)致數(shù)據(jù)丟失,需要恢復(fù)數(shù)據(jù)咏闪,請(qǐng)?jiān)诘谝粫r(shí)間通知DBA曙搬,并提供準(zhǔn)確時(shí)間摔吏,誤操作語(yǔ)句等重要線索鸽嫂。


FAQ
1-1.庫(kù)名、表名征讲、字段名必須使用小寫(xiě)字母据某,“_”分割。
a)MySQL有配置參數(shù)lower_case_table_names诗箍,不可動(dòng)態(tài)更改癣籽,linux系統(tǒng)默認(rèn)為0,即庫(kù)表名以實(shí)際情況存儲(chǔ)滤祖,大小寫(xiě)敏感筷狼。如果是1,以小寫(xiě)存儲(chǔ)匠童,大小寫(xiě)不敏感埂材。如果是2,以實(shí)際情況存儲(chǔ)汤求,但以小寫(xiě)比較俏险。
b) 如果大小寫(xiě)混合用严拒,可能存在abc,Abc,ABC等多個(gè)表共存,容易導(dǎo)致混亂竖独。
c) 字段名顯示區(qū)分大小寫(xiě)裤唠,但實(shí)際使用不區(qū)分,即不可以建立兩個(gè)名字一樣但大小寫(xiě)不一樣的字段莹痢。
d) 為了統(tǒng)一規(guī)范种蘸, 庫(kù)名、表名竞膳、字段名使用小寫(xiě)字母劈彪。

1-2.庫(kù)名、表名顶猜、字段名必須不超過(guò)12個(gè)字符沧奴。
庫(kù)名、表名长窄、字段名支持最多64個(gè)字符滔吠,但為了統(tǒng)一規(guī)范、易于辨識(shí)以及減少傳輸量挠日,必須不超過(guò)12字符疮绷。

1-3.庫(kù)名、表名嚣潜、字段名見(jiàn)名知意,建議使用名詞而不是動(dòng)詞冬骚。
a) 用戶評(píng)論可用表名usercomment或者comment。
b) 庫(kù)表是一種客觀存在的事物懂算,一種對(duì)象只冻,所以建議使用名詞。

1-4.建議使用InnoDB存儲(chǔ)引擎计技。
a) 5.5以后的默認(rèn)引擘喜德,支持事務(wù),行級(jí)鎖垮媒,更好的恢復(fù)性舍悯,高并發(fā)下性能更好,對(duì)多核睡雇,大內(nèi)存萌衬,ssd等硬件支持更好。
b) 具體比較可見(jiàn)附件的官方白皮書(shū)它抱。

1-5.存儲(chǔ)精確浮點(diǎn)數(shù)必須使用DECIMAL替代FLOAT和DOUBLE秕豫。
a) mysql中的數(shù)值類(lèi)型(不包括整型): IEEE754浮點(diǎn)數(shù):float (單精度) , double 或real (雙精度) 定點(diǎn)數(shù): decimal或 numeric 單精度浮點(diǎn)數(shù)的有效數(shù)字二進(jìn)制是24位抗愁,按十進(jìn)制來(lái)說(shuō)馁蒂,是8位呵晚;雙精度浮點(diǎn)數(shù)的有效數(shù)字二進(jìn)制是53位,按十進(jìn)制來(lái)說(shuō)沫屡,是16 位 一個(gè)實(shí)數(shù)的有效數(shù)字超過(guò)8位饵隙,用單精度浮點(diǎn)數(shù)來(lái)表示的話,就會(huì)產(chǎn)生誤差沮脖!同樣金矛,如果一個(gè)實(shí)數(shù)的有效數(shù)字超過(guò)16位,用雙精度浮點(diǎn)數(shù)來(lái)表示勺届,也會(huì)產(chǎn)生誤差b)IEEE754標(biāo)準(zhǔn)的計(jì)算機(jī)浮點(diǎn)數(shù)驶俊,在內(nèi)部是用二進(jìn)制表示的,但在將一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制浮點(diǎn)數(shù)時(shí)免姿,也會(huì)造成誤差饼酿,原因是不是所有的數(shù)都能轉(zhuǎn)換成有限長(zhǎng)度的二進(jìn)制數(shù)。 即一個(gè)二進(jìn)制可以準(zhǔn)確轉(zhuǎn)換成十進(jìn)制胚膊,但一個(gè)帶小數(shù)的十進(jìn)制不一定能夠準(zhǔn)確地用二進(jìn)制來(lái)表示故俐。實(shí)例:drop table if exists t;create table t(value float(10,2));insert into t values(131072.67),(131072.68);select value from t;
+-----------+
|value |
+-----------+
| 131072.67 |
| 131072.69 |
+-----------+

1-6.建議使用UNSIGNED存儲(chǔ)非負(fù)數(shù)值。
同樣的字節(jié)數(shù)紊婉,存儲(chǔ)的數(shù)值范圍更大药版。如tinyint 有符號(hào)為 -128-127,無(wú)符號(hào)為0-255

1-7. 如何使用INT UNSIGNED存儲(chǔ)ip喻犁?
使用INTUNSIGNED而不是char(15)來(lái)存儲(chǔ)ipv4地址槽片,通過(guò)MySQL函數(shù)inet_ntoa和inet_aton來(lái)進(jìn)行轉(zhuǎn)化。Ipv6地址目前沒(méi)有轉(zhuǎn)化函數(shù)肢础,需要使用DECIMAL或者兩個(gè)bigINT來(lái)存儲(chǔ)还栓。例如:
SELECT INET_ATON('209.207.224.40');
3520061480
SELECT INET_NTOA(3520061480);
209.207.224.40

1-8. INT[M],M值代表什么含義乔妈?
注意數(shù)值類(lèi)型括號(hào)后面的數(shù)字只是表示寬度而跟存儲(chǔ)范圍沒(méi)有關(guān)系蝙云,比如INT(3)默認(rèn)顯示3位氓皱,空格補(bǔ)齊路召,超出時(shí)正常顯示,python波材、java客戶端等不具備這個(gè)功能股淡。

1-10.不建議使用ENUM、SET類(lèi)型廷区,使用TINYINT來(lái)代替唯灵。
a)ENUM,有三個(gè)問(wèn)題:添加新的值要做DDL隙轻,默認(rèn)值問(wèn)題(將一個(gè)非法值插入ENUM(也就是說(shuō)埠帕,允許的值列之外的字符串)垢揩,將插入空字符串以作為特殊錯(cuò)誤值),索引值問(wèn)題(插入數(shù)字實(shí)際是插入索引對(duì)應(yīng)的值)
實(shí)例:
drop table if exists t;
create table t(sex enum('0','1'));
insert into t values(1);
insert into t values('3');
select * from t;
+------+
| sex |
+------+
| 0 |
| |
+------+
2 rows in set (0.00 sec)

1-11.盡可能不使用TEXT敛瓷、BLOB類(lèi)型叁巨。
a) 索引排序問(wèn)題,只能使用max_sort_length的長(zhǎng)度或者手工指定ORDER BY SUBSTRING(column,length)的長(zhǎng)度來(lái)排序
b) Memory引擘不支持text,blog類(lèi)型呐籽,會(huì)在磁盤(pán)上生成臨時(shí)表
c) 可能浪費(fèi)更多的空間
d) 可能無(wú)法使用adaptive hash index
e) 導(dǎo)致使用where沒(méi)有索引的語(yǔ)句變慢

1-13. VARCHAR中會(huì)產(chǎn)生額外存儲(chǔ)嗎锋勺?
VARCHAR(M),如果M<256時(shí)會(huì)使用一個(gè)字節(jié)來(lái)存儲(chǔ)長(zhǎng)度狡蝶,如果M>=256則使用兩個(gè)字節(jié)來(lái)存儲(chǔ)長(zhǎng)度庶橱。

1-14.表字符集選擇UTF8。
a) 使用utf8字符集贪惹,如果是漢字苏章,占3個(gè)字節(jié),但ASCII碼字符還是1個(gè)字節(jié)奏瞬。b) 統(tǒng)一布近,不會(huì)有轉(zhuǎn)換產(chǎn)生亂碼風(fēng)險(xiǎn)c) 其他地區(qū)的用戶(美國(guó)、印度丝格、臺(tái)灣)無(wú)需安裝簡(jiǎn)體中文支持撑瞧,就能正常看您的文字显蝌,并且不會(huì)出現(xiàn)亂碼d)ISO-8859-1編碼(latin1)使用了單字節(jié)內(nèi)的所有空間预伺,在支持ISO-8859-1的系統(tǒng)中傳輸和存儲(chǔ)其他任何編碼的字節(jié)流都不會(huì)被拋棄。即把其他任何編碼的字節(jié)流當(dāng)作ISO-8859-1編碼看待都沒(méi)有問(wèn)題曼尊,保存的是原封不動(dòng)的字節(jié)流酬诀。

1-15.使用VARBINARY存儲(chǔ)變長(zhǎng)字符串。
二進(jìn)制字節(jié)流骆撇,不存在編碼問(wèn)題

1-18. 為什么建議使用TIMESTAMP來(lái)存儲(chǔ)時(shí)間而不是DATETIME瞒御?
DATETIME和TIMESTAMP都是精確到秒,優(yōu)先選擇TIMESTAMP神郊,因?yàn)門(mén)IMESTAMP只有4個(gè)字節(jié)肴裙,而DATETIME8個(gè)字節(jié)。同時(shí)TIMESTAMP具有自動(dòng)賦值以及自動(dòng)更新的特性涌乳。
如何使用TIMESTAMP的自動(dòng)賦值屬性蜻懦?
a) 將當(dāng)前時(shí)間作為ts的默認(rèn)值:ts TIMESTAMP DEFAULTCURRENT_TIMESTAMP。
b) 當(dāng)行更新時(shí)夕晓,更新ts的值:ts TIMESTAMP DEFAULT 0 ONUPDATE CURRENT_TIMESTAMP宛乃。
c) 可以將1和2結(jié)合起來(lái):ts TIMESTAMP DEFAULTCURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

1-19.建議字段定義為NOT NULL。
a)如果null字段被索引征炼,需要額外的1字節(jié)
b)使索引析既,索引統(tǒng)計(jì),值的比較變得更復(fù)雜
c)可用0谆奥,''代替
d)如果是索引字段渡贾,一定要定義為not null

1-21.禁止在數(shù)據(jù)庫(kù)中使用VARBINARY、BLOB存儲(chǔ)圖片雄右、文件等空骚。
采用分布式文件系統(tǒng)更高效

2. 為什么MySQL的性能依賴于索引?
MySQL的查詢速度依賴良好的索引設(shè)計(jì)擂仍,因此索引對(duì)于高性能至關(guān)重要囤屹。合理的索引會(huì)加快查詢速度(包括UPDATE和DELETE的速度,MySQL會(huì)將包含該行的page加載到內(nèi)存中逢渔,然后進(jìn)行UPDATE或者DELETE操作)肋坚,不合理的索引會(huì)降低速度。
MySQL索引查找類(lèi)似于新華字典的拼音和部首查找肃廓,當(dāng)拼音和部首索引不存在時(shí)智厌,只能通過(guò)一頁(yè)一頁(yè)的翻頁(yè)來(lái)查找。當(dāng)MySQL查詢不能使用索引時(shí)盲赊,MySQL會(huì)進(jìn)行全表掃描铣鹏,會(huì)消耗大量的IO。

2-5. 為什么一張表中不能存在過(guò)多的索引哀蘑?
InnoDB的secondaryindex使用b+tree來(lái)存儲(chǔ)诚卸,因此在UPDATE、DELETE绘迁、INSERT的時(shí)候需要對(duì)b+tree進(jìn)行調(diào)整合溺,過(guò)多的索引會(huì)減慢更新的速度。

2-11. EXPLAIN語(yǔ)句
EXPLAIN語(yǔ)句(在MySQL客戶端中執(zhí)行)可以獲得MySQL如何執(zhí)行SELECT語(yǔ)句的信息缀台。通過(guò)對(duì)SELECT語(yǔ)句執(zhí)行EXPLAIN棠赛,可以知曉MySQL執(zhí)行該SELECT語(yǔ)句時(shí)是否使用了索引、全表掃描膛腐、臨時(shí)表睛约、排序等信息。盡量避免MySQL進(jìn)行全表掃描依疼、使用臨時(shí)表痰腮、排序等。詳見(jiàn)官方文檔律罢。

2-13.不建議使用%前綴模糊查詢,例如LIKE “%weibo”。
會(huì)導(dǎo)致全表掃描
2-14. 如何對(duì)長(zhǎng)度大于50的VARCHAR字段建立索引误辑?
下面的表增加一列url_crc32沧踏,然后對(duì)url_crc32建立索引,減少索引字段的長(zhǎng)度巾钉,提高效率翘狱。
CREATE TABLE url(

   ……
   url VARCHAR(255) NOT NULL DEFAULT 0,       url_crc32INT UNSIGNED NOT NULL DEFAULT 0,
   ……
   index idx_url(url_crc32)
)

2-16. 什么是覆蓋索引?
InnoDB 存儲(chǔ)引擎中砰苍,secondaryindex(非主鍵索引)中沒(méi)有直接存儲(chǔ)行地址潦匈,存儲(chǔ)主鍵值。如果用戶需要查詢secondaryindex中所不包含的數(shù)據(jù)列時(shí)赚导,需要先通過(guò)secondaryindex查找到主鍵值茬缩,然后再通過(guò)主鍵查詢到其他數(shù)據(jù)列,因此需要查詢兩次吼旧。
覆蓋索引的概念就是查詢可以通過(guò)在一個(gè)索引中完成凰锡,覆蓋索引效率會(huì)比較高,主鍵查詢是天然的覆蓋索引圈暗。
合理的創(chuàng)建索引以及合理的使用查詢語(yǔ)句掂为,當(dāng)使用到覆蓋索引時(shí)可以獲得性能提升。
比如SELECT email,uid FROM user_email WHEREuid=xx员串,如果uid不是主鍵勇哗,適當(dāng)時(shí)候可以將索引添加為index(uid,email),以獲得性能提升寸齐。

3-3.UPDATE智绸、DELETE語(yǔ)句不使用LIMIT。
a) 可能導(dǎo)致主從數(shù)據(jù)不一致
b) 會(huì)記錄到錯(cuò)誤日志访忿,導(dǎo)致日志占用大量空間
3-4. 為什么需要避免MySQL進(jìn)行隱式類(lèi)型轉(zhuǎn)化瞧栗?
因?yàn)镸ySQL進(jìn)行隱式類(lèi)型轉(zhuǎn)化之后,可能會(huì)將索引字段類(lèi)型轉(zhuǎn)化成=號(hào)右邊值的類(lèi)型海铆,導(dǎo)致使用不到索引迹恐,原因和避免在索引字段中使用函數(shù)是類(lèi)似的。

*3-6. 為什么不建議使用SELECT ?
增加很多不必要的消耗(cpu卧斟、io殴边、內(nèi)存、網(wǎng)絡(luò)帶寬)珍语;增加了使用覆蓋索引的可能性锤岸;當(dāng)表結(jié)構(gòu)發(fā)生改變時(shí),前段也需要更新板乙。

3-13. 如何減少與數(shù)據(jù)庫(kù)的交互次數(shù)是偷?
使用下面的語(yǔ)句來(lái)減少和db的交互次數(shù):
INSERT ... ON DUPLICATE KEY UPDATE
REPLACE
INSERT IGNORE
INSERT INTO values(),()如何結(jié)合使用多個(gè)緯度進(jìn)行散表散庫(kù)拳氢?
例如微博message,先按照crc32(message_id)將message散到16個(gè)庫(kù)中蛋铆,然后針對(duì)每個(gè)庫(kù)中的表馋评,一天生成一張新表。

3-14. 為什么不能使用ORDER BY rand()刺啦?
因?yàn)镺RDER BYrand()會(huì)將數(shù)據(jù)從磁盤(pán)中讀取留特,進(jìn)行排序,會(huì)消耗大量的IO和CPU玛瘸,可以在程序中獲取一個(gè)rand值蜕青,然后通過(guò)在從數(shù)據(jù)庫(kù)中獲取對(duì)應(yīng)的值。

3-15. MySQL中如何進(jìn)行分頁(yè)糊渊?
假如有類(lèi)似下面分頁(yè)語(yǔ)句:
SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;
這種分頁(yè)方式會(huì)導(dǎo)致大量的io右核,因?yàn)镸ySQL使用的是提前讀取策略。
推薦分頁(yè)方式:
SELECT * FROM table WHERE TIME<last_TIME ORDER BYTIME DESC LIMIT 10.
SELECT * FROM table inner JOIN(SELECT id FROM table ORDER BYTIME LIMIT 10000,10) as t USING(id)

3-17.為什么避免使用復(fù)雜的SQL再来?
拒絕使用復(fù)雜的SQL蒙兰,將大的SQL拆分成多條簡(jiǎn)單SQL分步執(zhí)行。原因:簡(jiǎn)單的SQL容易使用到MySQL的querycache芒篷;減少鎖表時(shí)間特別是MyISAM搜变;可以使用多核cpu。

  1. InnoDB存儲(chǔ)引擎為什么避免使用COUNT()?
    InnoDB表避免使用COUNT(
    )操作针炉,計(jì)數(shù)統(tǒng)計(jì)實(shí)時(shí)要求較強(qiáng)可以使用memcache或者redis挠他,非實(shí)時(shí)統(tǒng)計(jì)可以使用單獨(dú)統(tǒng)計(jì)表,定時(shí)更新篡帕。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末殖侵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子镰烧,更是在濱河造成了極大的恐慌拢军,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怔鳖,死亡現(xiàn)場(chǎng)離奇詭異茉唉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)结执,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)度陆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人献幔,你說(shuō)我怎么就攤上這事懂傀。” “怎么了蜡感?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蹬蚁,是天一觀的道長(zhǎng)恃泪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缚忧,這世上最難降的妖魔是什么悟泵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任杈笔,我火速辦了婚禮闪水,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒙具。我一直安慰自己球榆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布禁筏。 她就那樣靜靜地躺著持钉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪篱昔。 梳的紋絲不亂的頭發(fā)上每强,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音州刽,去河邊找鬼空执。 笑死,一個(gè)胖子當(dāng)著我的面吹牛穗椅,可吹牛的內(nèi)容都是我干的辨绊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匹表,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼门坷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起袍镀,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤默蚌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后苇羡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绸吸,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宣虾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惯裕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绣硝,死狀恐怖蜻势,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹉胖,我是刑警寧澤握玛,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布够傍,位于F島的核電站,受9級(jí)特大地震影響挠铲,放射性物質(zhì)發(fā)生泄漏冕屯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一拂苹、第九天 我趴在偏房一處隱蔽的房頂上張望安聘。 院中可真熱鬧,春花似錦瓢棒、人聲如沸浴韭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)念颈。三九已至,卻和暖如春连霉,著一層夾襖步出監(jiān)牢的瞬間榴芳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工跺撼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窟感,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓财边,卻偏偏與公主長(zhǎng)得像肌括,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酣难,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一谍夭、 表設(shè)計(jì) 庫(kù)名、表名憨募、字段名必須使用小寫(xiě)字母紧索,“_”分割。 庫(kù)名菜谣、表名珠漂、字段名必須不超過(guò)12個(gè)字符。 庫(kù)名尾膊、表...
    行動(dòng)家雷程文閱讀 388評(píng)論 0 0
  • SQL SELECT 語(yǔ)句 一媳危、查詢SQL SELECT 語(yǔ)法 (1)SELECT 列名稱 FROM 表名稱 (2...
    有錢(qián)且幸福閱讀 5,450評(píng)論 0 33
  • 什么是數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序冈敛。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API待笑,用于創(chuàng)建,訪問(wèn)抓谴,管理...
    chen_000閱讀 4,035評(píng)論 0 19
  • MySQL5.6從零開(kāi)始學(xué) 第一章 初始mysql 1.1數(shù)據(jù)庫(kù)基礎(chǔ) 數(shù)據(jù)庫(kù)是由一批數(shù)據(jù)構(gòu)成的有序的集合暮蹂,這些數(shù)據(jù)...
    星期四晚八點(diǎn)閱讀 1,154評(píng)論 0 4
  • 年少那時(shí)寞缝,你身邊所有的七大姑八大姨都在關(guān)心你在學(xué)校的成績(jī),所以作為新一代祖國(guó)花朵的你仰泻,被迫選擇了去學(xué)習(xí)荆陆,因?yàn)楹?..
    阿匆閱讀 320評(píng)論 0 2