所有 mysql 列型別都可以被索引,對相關列使用索引是提高 select 操作效能的最佳途徑。
mysql 中索引的儲存型別目前只有兩種(btree 和 hash),具體和表的儲存引擎相關:myisam 和 innodb 儲存引擎都只支援 btree 索引;memory/heap 儲存引擎可以支援 hash和 btree 索引。
myisam 和 innodb 儲存引擎的表預設建立的都是btree 索引。mysql 目前還不支援函式索引,但是支援字首索引,即對索引欄位的前 n 個字元建立索引。
mysql 中還支援全文本(fulltext)索引,該索引可以用於全文搜尋。但只限於 char、 varchar 和 text列。
memory 儲存引擎的表可以選擇使用 btree 索引或者 hash 索引,兩種不同型別的索引各有其不同的適用範圍。hash 索引有一些重要的特徵需要在使用的時候特別注意,如下所示。
而對於 btree 索引,當使用》、<、>=、<=、between、!=或者<>,或者 like 'pattern' (其中'pattern'不以萬用字元開始)操作符時,都可以使用相關列上的索引。
了解了 btree 索引和 hash 索引不同後,當使用 memory 表的時候,如果是預設建立的 hash索引,就要注意 sql 語句的編寫,確保可以使用上索引,如果一定要使用範圍查詢,那麼在建立索引的時候,就應該選擇建立成 btree 索引。
(1)對於建立的多列索引(復合索引),只要查詢的條件中用到了最左邊的列,索引一般就會被使用,舉例說明如下。
mysql> create index ind_sales2_companyid_moneys on sales2(company_id,moneys);
mysql> explain select * from sales2 where company_id = 2006\g;
mysql> explain select * from sales2 where moneys = 1\g;
可以發現即便 where 條件中不是用的 company_id 與 moneys 的組合條件,索引仍然能用到,這就是索引的字首特性。但是如果只按 moneys 條件查詢表,那麼索引就不會被用到。
(2)對於使用 like 的查詢,後面如果是常量並且只有%號不在第乙個字元,索引才可能會被使用。如果 like 後面跟的是乙個列的名字,那麼索引也不會被使用。
(3)如果對大的文字進行搜尋,使用全文索引而不用使用 like 『%...%』。
(4)如果列名是索引,使用 column_name is null 將使用索引。
需要注意以下情況是不會使用索引的:
在下列情況下,雖然存在索引,但是 mysql 並不會使用相應的索引。
(1)如果 mysql 估計使用索引比全表掃瞄更慢,則不使用索引。例如如果列key_part1 均勻分布在 1 和 100 之間,下列查詢中使用索引就不是很好:
select * from table_name where key_part1 > 1 and key_part1 < 90;
(2)如果使用memory/heap表並且 where 條件中不使用「=」進行索引列,那麼不會用到索引。heap 表只有在「=」的條件下才會使用索引。
(3)用 or 分割開的條件,如果 or 前的條件中的列有索引,而後面的列中沒有索引,那麼涉及到的索引都不會被用到。
(4)如果不是索引列的第一部分,雖然在 money 上面建有復合索引,但是由於 money 不是索引的第一列,那麼在查詢中這個索引也不會被 mysql 採用(字首特性)。
(5)如果 like 是以%開始。
(6) 如果列型別是字串,那麼一定記得在 where 條件中把字元常量值用引號引起來,否則的話即便這個列上有索引,mysql 也不會用到的,因為,mysql 預設把輸入的常量值進行轉換以後才進行檢索。
如果索引正在工作,handler_read_key 的值將很高,這個值代表了乙個行被索引值讀的次數,很低的值表明增加索引得到的效能改善不高,因為索引並不經常使用。handler_read_rnd_next 的值高則意味著查詢執行低效,並且應該建立索引補救。這個值的含義是在資料檔案中讀下一行的請求數。如果正進行大量的表掃瞄,handler_read_rnd_next 的值較高,則通常說明表索引不正確或寫入的查詢沒有利用索引,具體如下。
mysql> show status like 'handler_read%';
+-----------------------+-------+
| variable_name
| value |
+-----------------------+-------+
| handler_read_first | 0 |
| handler_read_key | 5 |
| handler_read_next | 0 |
| handler_read_prev | 0 |
| handler_read_rnd | 0 |
| handler_read_rnd_next | 2055 |
+-----------------------+-------+
從上面的例子中可以看出,目前使用的 mysql 資料庫的索引情況並不理想。 資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...