mysql索引基礎知識

題外話:mysql

     從深圳另外一個項目組交接了一個項目,這也是來到新公司後讓我接手的第一個項目。在我接手的這段日子了,請公司測試部門的同事對一些主要的業務進行的壓力測試。測試的結果並不理想。我仔細翻看了之前同事的邏輯以及數據庫表的建立和sql語句的寫法。發現有些sql並無很好的使用索引致使查詢響應時間並不理想。我本身其實索引也使用的很差。正好趁着這個機會買了本《mysql高性能》書籍進行學習。因爲書比較厚,只是針對索引部分學習了書本中的知識。在此整理一些知識點分享給和我有相似經驗的人。web

正文:sql

    索引是什麼:數據庫

    索引是存儲引擎用於快速找到記錄的一種數據結構。在mysql中,存儲引擎用相似的方法使用索引,其先在索引中找到對應的值,而後根據匹配的索引記錄找到對應的數據行。mysql只能高效的使用索引的最左前綴列。建立一個包含兩個列的索引,和建立兩個只包含一列的索引是大不相同的。mysql中,索引是在存儲引擎層而不是在服務器層現實的。因此,並無統一的索引標準。當人們談論索引的時候,若是沒有特別指明類型,那多半說的是B-Tree索引,它使用B-Tree數據結構來存儲數據。服務器

    說到這裏特別強調了最左前綴列。那麼在寫sql的時候怎麼樣才能使用到這種B-Tree索引呢?下面總結出了幾點須要注意的地方:數據結構

    • 全值匹配:全值匹配指的是和索引中的全部列進行匹配性能

    • 匹配最左前綴:即只使用索引的第一列。學習

    • 匹配列前綴:也能夠匹配某一列的值得開頭部分。這裏也只使用了索引的第一列。測試

    • 匹配範圍值:這裏也是使用了索引的第一列。優化

    • 精準匹配某一列並範圍匹配另一列

    • 只訪問索引的查詢:B-TREE一般能夠支持「只訪問索引的查詢」,即查詢只須要訪問索引,而無需訪問數據行。

    那麼也有些方式是不能使用到索引的,下面有些須要注意的地方:

    • 若是不是按照索引的最左列開始查找,則沒法使用索引

    • 不能跳過索引中的列

    • 若是查詢中有某個列的範圍查詢,則其右邊全部列都沒法使用索引優化查找

    書中別特強調了索引的順序很重要這些限制都和索引列的順序有關。在優化性能的時候,可能須要使用相同的列但順序不一樣的索引來知足不一樣類型的查詢需求。

    下面針對上面介紹的注意點給出一些本身測試的示例,來幫助你們理解:

    CREATE TABLE `person` (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `name` varchar(30) DEFAULT NULL,

      `age` int(11) NOT NULL,

      `number` int(1) NOT NULL,

      PRIMARY KEY (`id`),

      KEY `idx_person_name` (`name`,`age`)

    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

    mysql> EXPLAIN select * from person where age=10;

    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+

    | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |

    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+

    |  1 | SIMPLE      | person | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |

    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+

    經過上面的例子能夠看到什麼叫作最左前綴。

相關文章
相關標籤/搜索