第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

MySQL 索引詳細(xì)解讀

索引是數(shù)據(jù)庫中用來提高性能的常用工具。本節(jié)主要介紹 MySQL 索引的概念,及其優(yōu)點(diǎn)。

1.索引概念

索引在 MySQL 中也叫“鍵(Key)”,是存儲引擎用于快速查找記錄的一種數(shù)據(jù)結(jié)構(gòu),這也是索引的基本功能。

MySQL 索引的工作原理,類似一本書的目錄,如果要在一本書中找到特定的知識點(diǎn),先通過目錄找到對應(yīng)的頁碼。在 MySQL 中,存儲引擎用類似的方法使用索引,先在索引找到對應(yīng)值,再根據(jù)索引記錄找到對應(yīng)的數(shù)據(jù)行。簡單總結(jié),索引就是為了提高數(shù)據(jù)查詢的效率,跟一本書的目錄一樣。

以下查詢假設(shè)字段 c2 上建有索引,則存儲引擎將通過索引找到 c2 等于 測試01 的行。也就是說,存儲引擎先在索引按值進(jìn)行查找,再返回所有包含該值的數(shù)據(jù)行。

mysql> select * from t1 where c2='測試01'\G
*************************** 1. row ***************************
c1: 1
c2: 測試01
1 row in set (0.00 sec)

從執(zhí)行計(jì)劃的角度,也可以看出索引 idx_c2 被使用:

mysql> create table t1(
    ->     c1 int not null auto_increment,
    ->     c2 varchar(10) default null,
    ->     primary key(c1)
    -> ) engine = innodb;
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t1() values(1,'測試01');
Query OK, 1 row affected (0.00 sec)

mysql> create index idx_c2 on t1(c2);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select * from t1 where c2='測試01'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: ref
possible_keys: idx_c2
          key: idx_c2
      key_len: 33
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

常見的索引類型主要有 B-Tree 索引、哈希索引、空間數(shù)據(jù)索引(R-Tree)、全文索引,在后續(xù)小節(jié)將詳細(xì)介紹。

  • InnoDB 和 MyISAM 存儲引擎可以創(chuàng)建 B-Tree 索引,單列或多列都可以創(chuàng)建索引;

  • Memory 存儲引擎可以創(chuàng)建哈希索引,同時(shí)也支持 B-Tree 索引;

  • 從 MySQL5.7 開始,InnoDB 和 MyISAM 存儲引擎都可以支持空間類型索引;

  • InnoDB 和 MyISAM 存儲可以支持全文索引(FULLTEXT),該索引可以用于全文搜索,僅限于CHAR、VARCHAR、TEXT 列。

2. 索引優(yōu)點(diǎn)

索引最大的作用是快速查找數(shù)據(jù),除此之外,索引還有其他的附加作用。

B-Tree 是最常見的索引,按照順序存儲數(shù)據(jù),它可以用來做 order bygroup by 操作。因?yàn)?B-Tree 是有序的,將相關(guān)的值都存儲在一起。因?yàn)樗饕鎯α藢?shí)際的列值,某些查詢僅通過索引就可以完成查詢,如覆蓋查詢。

總的來說,索引三個(gè)優(yōu)點(diǎn)如下:

  • 索引可以大大減少 MySQL 需要掃描的數(shù)據(jù)量;
  • 索引可以幫助 MySQL 避免排序和臨時(shí)表;
  • 索引可以將隨機(jī) IO 變?yōu)轫樞?IO。

但是,索引是最好的解決方案嗎?任何事物都是有兩面性的,索引同樣如此。索引并不總是最好的優(yōu)化工具

  • 對于非常小的表,大多數(shù)情況,全表掃描會更高效;
  • 對于中大型表,索引就非常有效;
  • 對于特大型表,建索引和用索引的代價(jià)是日益增長,這時(shí)候可能需要和其他技術(shù)結(jié)合起來,如分區(qū)表。

總的來說,只有當(dāng)使用索引利大于弊時(shí),索引才是最好的優(yōu)化工具。

3. 小結(jié)

本節(jié)主要學(xué)習(xí)了索引的基本概念和優(yōu)點(diǎn)。以一句話來總結(jié):索引就是為了提高數(shù)據(jù)查詢的效率,跟一本書的目錄一樣。同時(shí)我們也要認(rèn)識到,索引很好,但并不總是最好的解決方案,索引也會帶來一些負(fù)面效果。