MySQL 優(yōu)化點(diǎn)

MySQL 優(yōu)化

表關(guān)聯(lián)查詢時務(wù)必遵循小表驅(qū)動大表原則玷禽;

使用查詢語句where條件時赫段,不允許出現(xiàn)函數(shù),否則索引會失效矢赁;

使用單表查詢時糯笙,相同字段盡量不要用OR,因?yàn)榭赡軐?dǎo)致索引失效撩银,比如:SELECT * FROM table WHERE name = '手機(jī)' OR name = '電腦'给涕,可以使用UNION替代;

LIKE語句不允許使用%開頭额获,否則索引會失效够庙;

組合索引一定要遵循從左到右原則,否則索引會失效抄邀;比如:SELECT * FROM table WHERE name = '張三' AND age = 18耘眨,那么該組合索引必須是name,age形式;

索引不宜過多境肾,根據(jù)實(shí)際情況決定剔难,盡量不要超過 10 個;

每張表都必須有主鍵准夷,達(dá)到加快查詢效率的目的钥飞;

分表,可根據(jù)業(yè)務(wù)字段尾數(shù)中的個位或十位或百位(以此類推)做表名達(dá)到分表的目的衫嵌;

分庫读宙,可根據(jù)業(yè)務(wù)字段尾數(shù)中的個位或十位或百位(以此類推)做庫名達(dá)到分庫的目的;

表分區(qū)楔绞,類似于硬盤分區(qū)结闸,可以將某個時間段的數(shù)據(jù)放在分區(qū)里唇兑,加快查詢速度,可以配合分表 + 表分區(qū)結(jié)合使用

神器 EXPLAIN 語句

EXPLAIN顯示了 MySQL 如何使用索引來處理SELECT語句以及連接表桦锄≡剑可以幫助選擇更好的索引和寫出更優(yōu)化的查詢語句。

使用方法结耀,在SELECT語句前加上EXPLAIN即可留夜,如:

EXPLAIN SELECT * FROM tb_item WHERE cid IN (SELECT id FROM tb_item_cat)

id:SELECT 識別符。這是 SELECT 的查詢序列號

select_type:SELECT類型,可以為以下任何一種

SIMPLE: 簡單 SELECT(不使用 UNION 或子查詢)

PRIMARY: 最外面的 SELECT

UNION: UNION 中的第二個或后面的 SELECT 語句

DEPENDENT UNION: UNION 中的第二個或后面的 SELECT 語句,取決于外面的查詢

UNION RESULT: UNION 的結(jié)果

SUBQUERY: 子查詢中的第一個 SELECT

DEPENDENT SUBQUERY: 子查詢中的第一個 SELECT,取決于外面的查詢

DERIVED: 導(dǎo)出表的 SELECT(FROM 子句的子查詢)

table:輸出的行所引用的表

partitions:表分區(qū)

type:聯(lián)接類型图甜。下面給出各種聯(lián)接類型碍粥,按照從最佳類型到最壞類型進(jìn)行排序

system: 表僅有一行(=系統(tǒng)表)。這是 const 聯(lián)接類型的一個特例黑毅。

const: 表最多有一個匹配行,它將在查詢開始時被讀取嚼摩。因?yàn)閮H有一行,在這行的列值可被優(yōu)化器剩余部分認(rèn)為是常數(shù)。const 表很快,因?yàn)樗鼈冎蛔x取一次!

eq_ref: 對于每個來自于前面的表的行組合, 從該表中讀取一行矿瘦。這可能是最好的聯(lián)接類型, 除了 const 類型枕面。

ref: 對于每個來自于前面的表的行組合, 所有有匹配索引值的行將從這張表中讀取。

ref_or_null: 該聯(lián)接類型如同 ref,但是添加了 MySQL 可以專門搜索包含 NULL 值的行缚去。

index_merge: 該聯(lián)接類型表示使用了索引合并優(yōu)化方法潮秘。

unique_subquery: 該類型替換了下面形式的 IN 子查詢的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一個索引查找函數(shù), 可以完全替換子查詢, 效率更高。

index_subquery: 該聯(lián)接類型類似于 unique_subquery病游〈娇纾可以替換 IN 子查詢, 但只適合下列形式的子查詢中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)

range: 只檢索給定范圍的行,使用一個索引來選擇行稠通。

index: 該聯(lián)接類型與 ALL 相同,除了只有索引樹被掃描衬衬。這通常比 ALL 快,因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小。

ALL: 對于每個來自于先前的表的行組合, 進(jìn)行完整的表掃描改橘。

possible_keys:指出 MySQL 能使用哪個索引在該表中找到行

key:顯示 MySQL 實(shí)際決定使用的鍵(索引)滋尉。如果沒有選擇索引, 鍵是 NULL。

key_len:顯示 MySQL 決定使用的鍵長度飞主。如果鍵是 NULL, 則長度為 NULL狮惜。

ref:顯示使用哪個列或常數(shù)與 key 一起從表中選擇行。

rows:顯示 MySQL 認(rèn)為它執(zhí)行查詢時必須檢查的行數(shù)碌识。多行之間的數(shù)據(jù)相乘可以估算要處理的行數(shù)碾篡。

filtered:顯示了通過條件過濾出的行數(shù)的百分比估計值。

Extra:該列包含 MySQL 解決查詢的詳細(xì)信息

Distinct: MySQL 發(fā)現(xiàn)第 1 個匹配行后,停止為當(dāng)前的行組合搜索更多的行筏餐。

Not exists: MySQL 能夠?qū)Σ樵冞M(jìn)行 LEFT JOIN 優(yōu)化, 發(fā)現(xiàn) 1 個匹配 LEFT JOIN 標(biāo)準(zhǔn)的行后, 不再為前面的的行組合在該表內(nèi)檢查更多的行开泽。

range checked for each record (index map: #): MySQL 沒有發(fā)現(xiàn)好的可以使用的索引, 但發(fā)現(xiàn)如果來自前面的表的列值已知, 可能部分索引可以使用。

Using filesort: MySQL 需要額外的一次傳遞, 以找出如何按排序順序檢索行魁瞪。

Using index: 從只使用索引樹中的信息而不需要進(jìn)一步搜索讀取實(shí)際的行來檢索表中的列信息穆律。

Using temporary: 為了解決查詢, MySQL 需要創(chuàng)建一個臨時表來容納結(jié)果惠呼。

Using where: WHERE 子句用于限制哪一個行匹配下一個表或發(fā)送到客戶。

Using sort_union(...), Using union(...), Using intersect(...): 這些函數(shù)說明如何為 index_merge 聯(lián)接類型合并索引掃描峦耘。

Using index for group-by: 類似于訪問表的 Using index 方式,Using index for group-by 表示 MySQL 發(fā)現(xiàn)了一個索引,可以用來查詢 GROUP BY 或 DISTINCT 查詢的所有列, 而不要額外搜索硬盤訪問實(shí)際的表剔蹋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辅髓,隨后出現(xiàn)的幾起案子泣崩,更是在濱河造成了極大的恐慌,老刑警劉巖洛口,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件律想,死亡現(xiàn)場離奇詭異,居然都是意外死亡绍弟,警方通過查閱死者的電腦和手機(jī)技即,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樟遣,“玉大人而叼,你說我怎么就攤上這事”” “怎么了葵陵?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞻佛。 經(jīng)常有香客問我脱篙,道長,這世上最難降的妖魔是什么伤柄? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任绊困,我火速辦了婚禮,結(jié)果婚禮上适刀,老公的妹妹穿的比我還像新娘秤朗。我一直安慰自己,他們只是感情好笔喉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布取视。 她就那樣靜靜地躺著,像睡著了一般常挚。 火紅的嫁衣襯著肌膚如雪作谭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天奄毡,我揣著相機(jī)與錄音折欠,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛怨酝,可吹牛的內(nèi)容都是我干的傀缩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼农猬,長吁一口氣:“原來是場噩夢啊……” “哼赡艰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斤葱,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慷垮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后揍堕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體料身,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年衩茸,在試婚紗的時候發(fā)現(xiàn)自己被綠了芹血。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡楞慈,死狀恐怖幔烛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囊蓝,我是刑警寧澤饿悬,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站聚霜,受9級特大地震影響狡恬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝎宇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一弟劲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夫啊,春花似錦函卒、人聲如沸辆憔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虱咧。三九已至熊榛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腕巡,已是汗流浹背玄坦。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煎楣。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓豺总,卻偏偏與公主長得像,于是被迫代替她去往敵國和親择懂。 傳聞我的和親對象是個殘疾皇子喻喳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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