《Mysql必讀如何使用索引提高查詢速度》要點(diǎn):
本文介紹了Mysql必讀如何使用索引提高查詢速度,希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL學(xué)習(xí)使用索引提高查詢速度
1.前言
在web開發(fā)中,頁面模板,業(yè)務(wù)邏輯(包括緩存、連接池)和數(shù)據(jù)庫這三個部分,數(shù)據(jù)庫在其中負(fù)責(zé)執(zhí)行SQL查詢并返回查詢結(jié)果,是影響網(wǎng)站速度最重要的性能瓶頸.本文主要針對MySql數(shù)據(jù)庫,雙十一的電商大戰(zhàn),引發(fā)了淘寶技術(shù)熱議,而淘寶現(xiàn)在去IOE(I代表IBM的縮寫,即去IBM的存儲設(shè)備和小型機(jī);O是代表Oracle的縮寫,也即去Oracle數(shù)據(jù)庫,采用MySQL和Hadoop替代的解決方案,;E是代表EMC2,即去EMC2的設(shè)備性,用PC Server替代EMC2),大量采用MySql集群!讓MySql再次成為耀眼的明星!而優(yōu)化數(shù)據(jù)的重要一步就是索引的建立,對于mysql中出現(xiàn)的慢查詢,我們可以通過使用索引來提升查詢速度.索引用于快速找出在某個列中有一特定值的行.不使用索引,MySQL將進(jìn)行全表掃描,從第1條記錄開始然后讀完整個表直到找出相關(guān)的行.
MYSQL學(xué)習(xí)2.mysql索引類型及創(chuàng)建
常用的索引類型有
(1)主鍵索引
它是一種特殊的唯一索引,不允許有空值.一般是在建表的時候同時創(chuàng)建主鍵索引:
MYSQL學(xué)習(xí)查詢結(jié)果:
+----+-------------------+------------------------------------------+
| id | title???????????? | body???????????????????????????????????? |
+----+-------------------+------------------------------------------+
|? 5 | MySQL vs. YourSQL | In the following database comparison ... |
|? 1 | MySQL Tutorial??? | DBMS stands for DataBase ...???????????? |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
MATCH()函數(shù)對于一個字符串執(zhí)行資料庫內(nèi)的自然語言搜索.一個資料庫就是1套1個或2個包含在FULLTEXT內(nèi)的列.搜索字符串作為對AGAINST()的參數(shù)而被給定.對于表中的每一行, MATCH() 返回一個相關(guān)值,即, 搜索字符串和 MATCH()表中指定列中該行文字之間的一個相似性度量.
(5)復(fù)合索引
MYSQL學(xué)習(xí)3.在什么情況下使用索引
(1)為搜索字段建索引,如果在你的表中,某個字段你經(jīng)常用來做搜索,那么,請為其建立索引吧.一般來說,在WHERE和JOIN中出現(xiàn)的列需要建立索引以提高查詢速度.
例如從fps表(表中有name字段)中檢索姓名為"李武"的人,
下面用explain來解釋執(zhí)行建立索引和未建立索引的區(qū)別:
MYSQL學(xué)習(xí)a.未建立索引前
MYSQL學(xué)習(xí)(2)下面我們就來看看這個EXPLAIN分析結(jié)果的含義.
table:這是表的名字.
type:連接操作的類型.下面是MySQL文檔關(guān)于ref連接類型的說明:
“對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取.如果聯(lián)接只使用鍵的最左邊的前綴,或如果鍵不是
UNIQUE或PRIMARY KEY(換句話說,如果聯(lián)接不能基于關(guān)鍵字選擇單個行的話),則使用ref.如果使用的鍵僅僅匹配少量行,該聯(lián)接
類型是不錯的.” 在本例中,由于索引不是UNIQUE類型,ref是我們能夠得到的最好連接類型. 如果EXPLAIN顯示連接類型是“ALL”,而且你并不想從表里面選擇出大多數(shù)記錄,那么MySQL的操作效率將非常低,因?yàn)樗獟呙枵麄€表.你可以加入更多的索引來解決這個問題.預(yù)知更多信息,請參見MySQL的手冊說明.
possible_keys:
可能可以利用的索引的名字.這里的索引名字是創(chuàng)建索引時指定的索引昵稱;如果索引沒有昵稱,則默認(rèn)顯示的是索引中第一個列的名字
(在本例中,它是“idx_name”).
Key:
它顯示了MySQL實(shí)際使用的索引的名字.如果它為空(或NULL),則MySQL不使用索引.
key_len:
索引中被使用部分的長度,以字節(jié)計.
ref:
它顯示的是列的名字(或單詞“const”),MySQL將根據(jù)這些列來選擇行.在本例中,MySQL根據(jù)三個常量選擇行.
rows:
MySQL所認(rèn)為的它在找到正確的結(jié)果之前必須掃描的記錄數(shù).顯然,這里最理想的數(shù)字就是1. 本例中未索引前遍歷的記錄數(shù)為1041,而建立索引后為1
Extra:
這里可能出現(xiàn)許多不同的選項(xiàng),其中大多數(shù)將對查詢產(chǎn)生負(fù)面影響.在本例中,MySQL只是提醒我們它將用using where,using index子句限制搜索結(jié)果集.
MYSQL學(xué)習(xí)4.最常用的存儲引擎:
(1)Myisam存儲引擎:每個Myisam在磁盤上存儲成三個文件.文件名都和表名相同,擴(kuò)展名分別為.frm(存儲表定義)、.MYD(存儲數(shù)據(jù))、.MYI(存儲索引).數(shù)據(jù)文件和索引文件可以放置在不同目錄,平均分布io,獲得更快的速度.對存儲大小沒有限制,MySQL數(shù)據(jù)庫的最大有效表尺寸通常是由操作系統(tǒng)對文件大小的限制決定的,
(2)InnoDB存儲引擎:具有提交、回滾、奔潰恢復(fù)能力的事務(wù)安全.與Myisam相比,InnoDB的寫效率差一些并且會占用更多的磁盤空間以保留數(shù)據(jù)和索引.
(3)如何選擇合適的引擎
下面是常用存儲引擎適用的環(huán)境:
Myisam:它是在Web、數(shù)據(jù)倉儲和其他應(yīng)用環(huán)境下最常使用的存儲引擎;
InnoDB:用于事務(wù)處理應(yīng)用程序,具有更多特性,包括ACID事務(wù)特性.
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/4883.html