1、選擇索引的數(shù)據(jù)類型
MySQL支持很多數(shù)據(jù)類型,選擇合適的數(shù)據(jù)類型存儲數(shù)據(jù)對性能有很大的影響。通常來說,可以遵循以下一些指導原則:
(1)越小的數(shù)據(jù)類型通常更好:越小的數(shù)據(jù)類型通常在磁盤、內(nèi)存和CPU緩存中都需要更少的空間,處理起來更快。
(2)簡單的數(shù)據(jù)類型更好:整型數(shù)據(jù)比起字符,處理開銷更小,因為字符串的比較更復(fù)雜。在MySQL中,應(yīng)該用內(nèi)置的日期和時間數(shù)據(jù)類型,而不是用字符串來存儲時間;以及用整型數(shù)據(jù)類型存儲IP地址。
(3)盡量避免NULL:應(yīng)該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優(yōu)化,因為它們使得索引、索引的統(tǒng)計信息以及比較運算更加復(fù)雜。你應(yīng)該用0、一個特殊的值或者一個空串代替空值。
1.1、選擇標識符
選擇合適的標識符是非常重要的。選擇時不僅應(yīng)該考慮存儲類型,而且應(yīng)該考慮MySQL是怎樣進行運算和比較的。一旦選定數(shù)據(jù)類型,應(yīng)該保證所有相關(guān)的表都使用相同的數(shù)據(jù)類型。
(1)?? ?整型:通常是作為標識符的最好選擇,因為可以更快的處理,而且可以設(shè)置為AUTO_INCREMENT。
(2)?? ?字符串:盡量避免使用字符串作為標識符,它們消耗更好的空間,處理起來也較慢。而且,通常來說,字符串都是隨機的,所以它們在索引中的位置也是隨機的,這會導致頁面分裂、隨機訪問磁盤,聚簇索引分裂(對于使用聚簇索引的存儲引擎)。
2、索引入門
對于任何DBMS,索引都是進行優(yōu)化的最主要的因素。對于少量的數(shù)據(jù),沒有合適的索引影響不是很大,但是,當隨著數(shù)據(jù)量的增加,性能會急劇下降。
如果對多列進行索引(組合索引),列的順序非常重要,MySQL僅能對索引最左邊的前綴進行有效的查找。例如:
假 設(shè)存在組合索引it1c1c2(c1,c2),查詢語句select * from t1 where c1=1 and c2=2能夠使用該索引。查詢語句select * from t1 where c1=1也能夠使用該索引。但是,查詢語句select * from t1 where c2=2不能夠使用該索引,因為沒有組合索引的引導列,即,要想使用c2列進行查找,必需出現(xiàn)c1等于某值。
2.1、索引的類型
索引是在存儲引擎中實現(xiàn)的,而不是在服務(wù)器層中實現(xiàn)的。所以,每種存儲引擎的索引都不一定完全相同,并不是所有的存儲引擎都支持所有的索引類型。
2.1.1、B-Tree索引
假設(shè)有如下一個表:
CREATE?TABLE?People?( ?????last_name?varchar(50)????not?null, ?????first_name?varchar(50)????not???null, ?????dob????????date???????????not?null, ?????gender?????enum('m',?'f')?not???null, ?????key(last_name,?first_name,?dob) );
?其索引包含表中每一行的last_name、first_name和dob列。其結(jié)構(gòu)大致如下:
索引存儲的值按索引列中的順序排列。可以利用B-Tree索引進行全關(guān)鍵字、關(guān)鍵字范圍和關(guān)鍵字前綴查詢,當然,如果想使用索引,你必須保證按索引的最左邊前綴(leftmost prefix of the index)來進行查詢。
(1)匹配全值(Match the full value):對索引中的所有列都指定具體的值。例如,上圖中索引可以幫助你查找出生于1960-01-01的Cuba Allen。
(2)匹配最左前綴(Match a leftmost prefix):你可以利用索引查找last name為Allen的人,僅僅使用索引中的第1列。
(3)匹配列前綴(Match a column prefix):例如,你可以利用索引查找last name以J開始的人,這僅僅使用索引中的第1列。
(4)匹配值的范圍查詢(Match a range of values):可以利用索引查找last name在Allen和Barrymore之間的人,僅僅使用索引中第1列。
(5)匹配部分精確而其它部分進行范圍匹配(Match one part exactly and match a range on another part):可以利用索引查找last name為Allen,而first name以字母K開始的人。
(6)僅對索引進行查詢(Index-only queries):如果查詢的列都位于索引中,則不需要讀取元組的值。
由于B-樹中的節(jié)點都是順序存儲的,所以可以利用索引進行查找(找某些值),也可以對查詢結(jié)果進行ORDER BY。當然,使用B-tree索引有以下一些限制:
(1) 查詢必須從索引的最左邊的列開始。關(guān)于這點已經(jīng)提了很多遍了。例如你不能利用索引查找在某一天出生的人。
(2) 不能跳過某一索引列。例如,你不能利用索引查找last name為Smith且出生于某一天的人。
(3) 存儲引擎不能使用索引中范圍條件右邊的列。例如,如果你的查詢語句為WHERE last_name=”Smith” AND first_name LIKE ‘J%’ AND dob=’1976-12-23’,則該查詢只會使用索引中的前兩列,因為LIKE是范圍查詢。
以上就是Mysql索引和優(yōu)化的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!