1.使用索引
應(yīng)盡量避免全表掃描显拜,首先應(yīng)考慮在 where 及 order by ,group by 涉及的列上建立索引
2.優(yōu)化 SQL 語(yǔ)句
2.1通過(guò) explain(查詢優(yōu)化神器)用來(lái)查看 SQL 語(yǔ)句的執(zhí)行效果
可以幫助選擇更好的索引和優(yōu)化查詢語(yǔ)句, 寫出更好的優(yōu)化語(yǔ)句矮固。 通常我們可以對(duì)比較復(fù)雜的尤其是涉及到多表的 SELECT 語(yǔ)句档址, 把關(guān)鍵字 EXPLAIN 加到前面, 查看執(zhí)行計(jì)劃守伸。例如: explain select * from news;
2.2任何地方都不要使用 select * from t
用具體的字段列表代替“*” 尼摹, 不要返回用不到的任何字段剂娄。
mysql innodb上的理解。
1宜咒,不需要的字段會(huì)增加數(shù)據(jù)傳輸?shù)臅r(shí)間故黑,即使mysql服務(wù)器和客戶端是在同一臺(tái)機(jī)器上,使用的協(xié)議還是tcp混埠,通信也是需要額外的時(shí)間诗轻。
2扳炬,要取的字段、索引的類型半醉,和這兩個(gè)也是有關(guān)系的缩多。舉個(gè)例子养晋,對(duì)于user表,有name和phone的聯(lián)合索引逊抡,select name from user where phone=12345678912 和 select * from user where phone=12345678912秦忿,前者要比后者的速度快灯谣,因?yàn)閚ame可以在索引上直接拿到蛔琅,不再需要讀取這條記錄了。
3辜窑,大字段穆碎,例如很長(zhǎng)的varchar所禀,blob,text色徘。準(zhǔn)確來(lái)說(shuō)褂策,長(zhǎng)度超過(guò)728字節(jié)的時(shí)候,會(huì)把超出的數(shù)據(jù)放到另外一個(gè)地方耿焊,因此讀取這條記錄會(huì)增加一次io操作搀别。
2.3索引列不能參與計(jì)算,保持列“干凈”
比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引歇父,原因很簡(jiǎn)單榜苫,b+樹中存的都是數(shù)據(jù)表中的字段值垂睬,但進(jìn)行檢索時(shí)抗悍,需要把所有元素都應(yīng)用函數(shù)才能比較,顯然成本太大赏壹。所以語(yǔ)句應(yīng)該寫成create_time = unix_timestamp(’2014-05-29’);
2.4查詢盡可能使用 limit 減少返回的行數(shù)蝌借, 減少數(shù)據(jù)傳輸時(shí)間和帶寬浪費(fèi)菩佑。
3 優(yōu)化數(shù)據(jù)庫(kù)對(duì)象
3.1優(yōu)化表的數(shù)據(jù)類型
使用 procedure analyse()函數(shù)對(duì)表進(jìn)行分析, 該函數(shù)可以對(duì)表中列的數(shù)據(jù)類型提出優(yōu)化建議凝化。 能小就用小稍坯。 表數(shù)據(jù)類型第一個(gè)原則是: 使用能正確的表示和存儲(chǔ)數(shù)據(jù)的最短類型。 這樣可以減少對(duì)磁盤空間搓劫、 內(nèi)存劣光、 cpu 緩存的使用袜蚕。
使用方法: select * from 表名 procedure analyse();
3.2 對(duì)表進(jìn)行拆分
通過(guò)拆分表可以提高表的訪問(wèn)效率。 有 2 種拆分方法
1.垂直拆分
把主鍵和一些列放在一個(gè)表中绢涡, 然后把主鍵和另外的列放在另一個(gè)表中。 如果一個(gè)表中某些列常用遣疯, 而另外一些不常用雄可, 則可以采用垂直拆分。
2.水平拆分
根據(jù)一列或者多列數(shù)據(jù)的值把數(shù)據(jù)行放到二個(gè)獨(dú)立的表中缠犀。
3.3 使用中間表來(lái)提高查詢速度
創(chuàng)建中間表数苫, 表結(jié)構(gòu)和源表結(jié)構(gòu)完全相同虐急, 轉(zhuǎn)移要統(tǒng)計(jì)的數(shù)據(jù)到中間表, 然后在中間表上進(jìn)行統(tǒng)計(jì)敬惦, 得出想要的結(jié)果。
4.硬件優(yōu)化
4.1 CPU 的優(yōu)化
選擇多核和主頻高的 CPU畴椰。
4.2 內(nèi)存的優(yōu)化
使用更大的內(nèi)存潜叛。 將盡量多的內(nèi)存分配給 MYSQL 做緩存销斟。
4.3 磁盤 I/O 的優(yōu)化
4.3.1 使用磁盤陣列
RAID 0 沒(méi)有數(shù)據(jù)冗余, 沒(méi)有數(shù)據(jù)校驗(yàn)的磁盤陳列棱诱。 實(shí)現(xiàn) RAID 0至少需要兩塊以上的硬盤, 它將兩塊以上的硬盤合并成一塊靡菇, 數(shù)據(jù)連續(xù)地分割在每塊盤上育苟。
RAID1 是將一個(gè)兩塊硬盤所構(gòu)成 RAID 磁盤陣列, 其容量?jī)H等于一塊硬盤的容量脖母, 因?yàn)榱硪粔K只是當(dāng)作數(shù)據(jù)“鏡像”。使用 RAID-0+1 磁盤陣列。 RAID 0+1 是 RAID 0 和 RAID 1 的組合形式。 它在提供與 RAID 1 一樣的數(shù)據(jù)安全保障的同時(shí)吕朵, 也提供了與 RAID 0 近似的存儲(chǔ)性能。
4.3.2 調(diào)整磁盤調(diào)度算法
選擇合適的磁盤調(diào)度算法梧税, 可以減少磁盤的尋道時(shí)間
5.MySQL 自身的優(yōu)化
對(duì) MySQL 自身的優(yōu)化主要是對(duì)其配置文件 my.cnf 中的各項(xiàng)參數(shù)進(jìn)行優(yōu)化調(diào)整。 如指定 MySQL 查詢緩沖區(qū)的大小, 指定 MySQL 允許的最大連接進(jìn)程數(shù)等。
6.應(yīng)用優(yōu)化
6.1 使用數(shù)據(jù)庫(kù)連接池
6.2 使用查詢緩存
它的作用是存儲(chǔ) select 查詢的文本及其相應(yīng)結(jié)果。 如果隨后收到一個(gè)相同的查詢, 服務(wù)器會(huì)從查詢緩存中直接得到查詢結(jié)果。 查詢緩存適用的對(duì)象是更新不頻繁的表偎快, 當(dāng)表中數(shù)據(jù)更改后姊氓, 查詢緩存中的相關(guān)條目就會(huì)被清空。