mysql優化學習記錄1--索引和order by

在看高性能  mysql 時,裏面有些總結寫得很好,因此就記錄下來,方便本身查詢。若是發現有寫得不對的,歡迎指出。mysql

數據表創建索引了,但若是查詢方式不對,則不能正確使用索引的快速查詢。sql

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)
)
服務器

1 . 單張表查詢時,索引列的順序應該和 order by 的順序同樣,而且全部列都應該是升序或是降序。這時查詢出來的結果是使用了索引而且對索引進行了排序。性能

2. 多表查詢時, order by 所引用的全部字段應該都是第一張表裏面的字段優化

B-Tree索引的限制:spa

1 若是不是按照索引的最左列開始查找,則沒法使用索引。例如上面例子中的索引在每用於查找名字爲Bill的人,也無怯查找某個特定生日的人,由於這兩列都不是最左數據列。相似地,也無戰查找姓氏以某個字母結尾的人。當把幾個列合併爲一個索引時,要使用索引,則必定要使用該索引中的第一列,好比上面的people表,其實只有一個索引 (last_name) ,要用到這個索引,則 where 條件中必定要使用到  last_name排序

 

2 不能跳過索引中的列。也就是說,前面所述的索引沒法用於查找姓爲Smith而且在某個特定日期出生的人。若是不指定名(first_name),則MySQL只能使用索引的第一列。索引

3 若是查詢中有某個列的範圍(like  between > < 都算範圍查詢)查詢,則其右邊全部列都沒法使用索引優化查找。例若有查詢 WHERE lastname='Smith’AND firstname like '%J%'AND dob=’1976-12-23',這個查詢只能使用索引的前兩列,由於這裏的like是一個範圍條件(可是服務器能夠把其他列用於其餘目的)。若是範圍查詢列值的數量有限,那麼能夠經過使用多個等於條件來代替範圍條件。查詢時,把條件屬於範圍的,放在最後面,由於它的右邊就不能使用索引了it

以上面那三個點,具體可看此 http://www.programgo.com/article/2117140041/ast

相關文章
相關標籤/搜索