欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
95%的人都不知道 MySQL還有索引管理與執行計劃

1.1 索引的介紹

  索引是對數據庫表中一列或多列的值進(jìn)行排序的一種結構,使用索引可快速訪(fǎng)問(wèn)數據庫表中的特定信息。如果想按特定職員的姓來(lái)查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取信息。

  索引的一個(gè)主要目的就是加快檢索表中數據的方法,亦即能協(xié)助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數據結構。

1.1.1 唯一索引

  唯一索引是不允許其中任何兩行具有相同索引值的索引。當現有數據中存在重復的鍵值時(shí),大多數數據庫不允許將新創(chuàng )建的唯一索引與表一起保存。數據庫還可能防止添加將在表中創(chuàng )建重復鍵值的新數據。

  例如,如果在employee表中職員的姓(lname)上創(chuàng )建了唯一索引,則任何兩個(gè)員工都不能同姓。

1.1.2 主鍵索引

  數據庫表經(jīng)常有一列或多列組合,其值唯一標識表中的每一行。該列稱(chēng)為表的主鍵。在數據庫關(guān)系圖中為表定義主鍵將自動(dòng)創(chuàng )建主鍵索引,主鍵索引是唯一索引的特定類(lèi)型。

  該索引要求主鍵中的每個(gè)值都唯一。當在查詢(xún)中使用主鍵索引時(shí),它還允許對數據的快速訪(fǎng)問(wèn)。

1.1.3 聚集索引

  在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個(gè)表只能包含一個(gè)聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪(fǎng)問(wèn)速度。

  聚集索引和非聚集索引的區別,如字典默認按字母順序排序,讀者如知道某個(gè)字的讀音可根據字母順序快速定位。因此聚集索引和表的內容是在一起的。如讀者需查詢(xún)某個(gè)生僻字,則需按字典前面的索引,舉例按偏旁進(jìn)行定位,找到該字對應的頁(yè)數,再打開(kāi)對應頁(yè)數找到該字。

  這種通過(guò)兩個(gè)地方而查詢(xún)到某個(gè)字的方式就如非聚集索引。

1.1.4 索引列

  可以基于數據庫表中的單列或多列創(chuàng )建索引。多列索引可以區分其中一列可能有相同值的行。如果經(jīng)常同時(shí)搜索兩列或多列或按兩列或多列排序時(shí),索引也很有幫助。

  例如,如果經(jīng)常在同一查詢(xún)中為姓和名兩列設置判據,那么在這兩列上創(chuàng )建多列索引將很有意義。

  檢查查詢(xún)的WHERE和JOIN子句。在任一子句中包括的每一列都是索引可以選擇的對象。對新索引進(jìn)行試驗以檢查它對運行查詢(xún)性能的影響??紤]已在表上創(chuàng )建的索引數量。最好避免在單個(gè)表上有很多索引。

  檢查已在表上創(chuàng )建的索引的定義。最好避免包含共享列的重疊索引。

檢查某列中唯一數據值的數量,并將該數量與表中的行數進(jìn)行比較。比較的結果就是該列的可選擇性,這有助于確定該列是否適合建立索引,如果適合,確定索引的類(lèi)型。

1.1.5 B樹(shù)算法


  B樹(shù)的搜索,從根結點(diǎn)開(kāi)始,如果查詢(xún)的關(guān)鍵字與結點(diǎn)的關(guān)鍵字相等,那么就命中;否則,如果查詢(xún)關(guān)鍵字比結點(diǎn)關(guān)鍵字小,就進(jìn)入左邊;如果比結點(diǎn)關(guān)鍵字大,就進(jìn)入右邊;如果左邊或右邊的指針為空,則報告找不到相應的關(guān)鍵。

如果B樹(shù)的所有非葉子結點(diǎn)的左右子樹(shù)的結點(diǎn)數目均保持差不多(平衡),那么B樹(shù)的搜索性能逼近二分查找;但它比連續內存空間的二分查找的優(yōu)點(diǎn)是,改變B樹(shù)結構(插入與刪除結點(diǎn))不需要移動(dòng)大段的內存數據,甚至通常是常數開(kāi)銷(xiāo)。

1.1.6 B+樹(shù)算法

B+樹(shù)是B-樹(shù)的變體,也是一種多路搜索樹(shù):

       1.其定義基本與B-樹(shù)同,除了:
       2.非葉子結點(diǎn)的子樹(shù)指針與關(guān)鍵字個(gè)數相同;
       3.非葉子結點(diǎn)的子樹(shù)指針P[i],指向關(guān)鍵字值屬于[K[i], K[i+1])的子樹(shù)(B-樹(shù)是開(kāi)區間);
       5.為所有葉子結點(diǎn)增加一個(gè)鏈指針;
       6.所有關(guān)鍵字都在葉子結點(diǎn)出現;
       如:(M=3)


   B+的搜索與B-樹(shù)也基本相同,區別是B+樹(shù)只有達到葉子結點(diǎn)才命中(B-樹(shù)可以在非葉子結點(diǎn)命中),其性能也等價(jià)于在關(guān)鍵字全集做一次二分查找;

? B+的特性:

       1.所有關(guān)鍵字都出現在葉子結點(diǎn)的鏈表中(稠密索引),且鏈表中的關(guān)鍵字恰好是有序的;
       2.不可能在非葉子結點(diǎn)命中;
       3.非葉子結點(diǎn)相當于是葉子結點(diǎn)的索引(稀疏索引),葉子結點(diǎn)相當于是存儲(關(guān)鍵字)數據的數據層;
       4.更適合文件索引系統;

1.1.7 HASH:HASH算法

  哈希索引只有Memory, NDB兩種引擎支持,Memory引擎默認支持哈希索引,如果多個(gè)hash值相同,出現哈希碰撞,那么索引以鏈表方式存儲。

  但是,Memory引擎表只對能夠適合機器的內存切實(shí)有限的數據集。

  要使InnoDB或MyISAM支持哈希索引,可以通過(guò)偽哈希索引來(lái)實(shí)現,叫自適應哈希索引。

  主要通過(guò)增加一個(gè)字段,存儲hash值,將hash值建立索引,在插入和更新的時(shí)候,建立觸發(fā)器,自動(dòng)添加計算后的hash到表里。

1.1.8 其他的索引

FULLTEXT:全文索引
RTREE:R樹(shù)索引

1.2 MySQL索引管理

  索引建立在表的列上(字段)的。

  在where后面的列建立索引才會(huì )加快查詢(xún)速度。

  pages<---索引(屬性)<----查數據。

添加索引的方法:

alter table test add index index_name(name);
create index index_name on test(name);

語(yǔ)法格式:

alter table 表 add index 索引名稱(chēng)(name);

1.2.1 創(chuàng )建普通索引

創(chuàng )建普通索引方法一:

mysql> ALTER TABLE PLAYERS ADD INDEX   name_idx(NAME);
mysql> desc PLAYERS;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| NAME       | char(15)    | NO   | MUL | NULL    |       |

創(chuàng )建普通索引方法二:

mysql> ALTER TABLE PLAYERS ADD INDEX   name_idx(NAME);
mysql> desc PLAYERS;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| NAME       | char(15)    | NO   | MUL | NULL    |       |

1.2.2 刪除索引

alter table PLAYERS delete INDEX  name_idx;
mysql> show index from  PLAYERS\G
*************************** 1. row ***************************
        Table: PLAYERS
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: PLAYERNO
    Collation: A
  Cardinality: 14
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment:

1.3 MySQL中的約束索引

主鍵索引

  只能有一個(gè)主鍵。

  主鍵索引:列的內容是唯一值,例如學(xué)號.

  表創(chuàng )建的時(shí)候至少要有一個(gè)主鍵索引,最好和業(yè)務(wù)無(wú)關(guān)。

普通索引

  加快查詢(xún)速度,工作中優(yōu)化數據庫的關(guān)鍵。

  在合適的列上建立索引,讓數據查詢(xún)更高效。

create index index_name on test(name);
alter table test add index index_name(name);

用了索引,查一堆內容。

  在where條件關(guān)鍵字后面的列建立索引才會(huì )加快查詢(xún)速度.

select id,name from test where state=1 order by id group by name;

唯一索引

  內容唯一,但不是主鍵。

create unique index index_name on test(name);

1.3.1 創(chuàng )建主鍵索引

  建立表時(shí)

CREATE TABLE `test` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

  建立表后增加

CREATE TABLE `test` (
`id` int(4) NOT NULL,
`name` char(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

增加自增主鍵

alter table test change id id int(4) primary key 
not null auto_increment;

1.3.2 使用字段前綴創(chuàng )建索引及聯(lián)合索引

前綴索引:根據字段的前N個(gè)字符建立索引

create index index_name on test(name(8));

聯(lián)合索引:多個(gè)字段建立一個(gè)索引。

where a女生 and b身高165 and c身材好
index(a,b,c)

  特點(diǎn):前綴生效特性。

a,ab,abc 可以走索引。
b ac bc c 不走索引(5.6之后 ac 可以走主鍵索引)。

  原則:把最常用來(lái)作為條件查詢(xún)的列放在前面。

*示例:*

創(chuàng )建表

 create table people (id int not null auto_increment ,name char(20),sr(20),sex int ,age int, primary key (id));

創(chuàng )建聯(lián)合索引

mysql> alter table people  add key name_sex_idx(name,sex)
    -> ;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

查看索引的類(lèi)型

mysql> desc people;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | YES  | MUL | NULL    |                |
| sex   | int(11)  | YES  |     | NULL    |                |
| age   | int(11)  | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+

建立唯一鍵索引

mysql> alter table people add unique key age_uidx(age);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

查看數據表

mysql> desc people;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | YES  | MUL | NULL    |                |
| sex   | int(11)  | YES  |     | NULL    |                |
| age   | int(11)  | YES  | UNI | NULL    |                |
+-------+----------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

  聯(lián)合主鍵是聯(lián)合索引的特殊形式

PRIMARY KEY (`Host`,`User`)
alter table test add sex char(4) not null;
create index ind_name_sex on test(name,sex);

前綴加聯(lián)合索引

create index index_name on test(name(8),sex(2));

1.4 SQL語(yǔ)句優(yōu)化

1.4.1 企業(yè)SQL優(yōu)化思路

  1、把一個(gè)大的不使用索引的SQL語(yǔ)句按照功能進(jìn)行拆分

  2、長(cháng)的SQL語(yǔ)句無(wú)法使用索引,能不能變成2條短的SQL語(yǔ)句讓它分別使用上索引。

  3、對SQL語(yǔ)句功能的拆分和修改

  4、減少“爛”SQL由運維(DBA)和開(kāi)發(fā)交流(確認),共同確定如何改,最終由DBA執行

  5、制定開(kāi)發(fā)流程

1.4.2 不適合走索引的場(chǎng)景

  1、唯一值少的列上不適合建立索引或者建立索引效率低。例如:性別列

  2、小表可以不建立索引,100條記錄。

  3、對于數據倉庫,大量全表掃描的情況,建索引反而會(huì )慢

1.4.3 查看表的唯一值數量

select count(distinct user) from mysql.user;
select count(distinct user,host) from mysql.user;

1.4.4 建立索引流程

  1、找到慢SQL。

show processlist;

    記錄慢查詢(xún)日志。

  2、explain select句,條件列多。

  3、查看表的唯一值數量:

select count(distinct user) from mysql.user;
select count(distinct user,host) from mysql.user;

    條件列多??梢钥紤]建立聯(lián)合索引。

  4、建立索引(流量低谷)

force index

  5、拆開(kāi)語(yǔ)句(和開(kāi)發(fā))。

  6、like '%%'不用mysql

  7、進(jìn)行判斷重復的行數

查看行數:

mysql> select count(*) from city;
+----------+
| count(*) |
+----------+
|     4079 |
+----------+
1 row in set (0.00 sec)

查看去重后的行數:

mysql> select count(distinct countrycode) from city;
+-----------------------------+
| count(distinct countrycode) |
+-----------------------------+
|                         232 |
+-----------------------------+
1 row in set (0.00 sec)

1.5 用explain查看SQL的執行計劃

  在工作中,我們用于捕捉性能問(wèn)題最常用的就是打開(kāi)慢查詢(xún),定位執行效率差的SQL,那么當我們定位到一個(gè)SQL以后還不算完事,我們還需要知道該SQL的執行計劃,比如是全表掃描,還是索引掃描,這些都需要通過(guò)EXPLAIN去完成。

  EXPLAIN命令是查看優(yōu)化器如何決定執行查詢(xún)的主要方法??梢詭椭覀兩钊肓私釳ySQL的基于開(kāi)銷(xiāo)的優(yōu)化器,還可以獲得很多可能被優(yōu)化器考慮到的訪(fǎng)問(wèn)策略的細節,以及當運行SQL語(yǔ)句時(shí)哪種策略預計會(huì )被優(yōu)化器采用。

  需要注意的是,生成的QEP并不確定,它可能會(huì )根據很多因素發(fā)生改變。MySQL不會(huì )將一個(gè)QEP和某個(gè)給定查詢(xún)綁定,QEP將由SQL語(yǔ)句每次執行時(shí)的實(shí)際情況確定,即便使用存儲過(guò)程也是如此。盡管在存儲過(guò)程中SQL語(yǔ)句都是預先解析過(guò)的,但QEP仍然會(huì )在每次調用存儲過(guò)程的時(shí)候才被確定。

1.5.1 查看 select 語(yǔ)句的執行過(guò)程

mysql> explain select id,name from test where name='clsn';
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | test  | ref  | name_idx      | name_idx | 24      | const |    1 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

  SQL_NO_CACHE的作用是禁止緩存查詢(xún)結果。

使用where****條件查找

mysql> explain select user,host from mysql.user where user='root' and host='127.0.0.1';
+----+-------------+-------+-------+---------------+---------+---------+-------------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref         | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------------+------+-------------+
|  1 | SIMPLE      | user  | const | PRIMARY       | PRIMARY | 228     | const,const |    1 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+-------------+------+-------------+
1 row in set (0.00 sec)

1.5.2 通過(guò)執行計劃可以知道什么?

mysql> explain select d1.age, t2.id from (select age,name from t1 where id in (1,2))d1, t2 where d1.age=t2.age group by d1.age, t2.id order by t2.id;
+----+-------------+------------+-------+---------------+---------+---------+--------+------+---------------------------------+
| id | select_type | table      | type  | possible_keys | key     | key_len | ref    | rows | Extra                           |
+----+-------------+------------+-------+---------------+---------+---------+--------+------+---------------------------------+
|  1 | PRIMARY     | <derived2> | ALL   | NULL          | NULL    | NULL    | NULL   |    2 | Using temporary; Using filesort |
|  1 | PRIMARY     | t2         | ref   | age           | age     | 5       | d1.age |    1 | Using where; Using index        |
|  2 | DERIVED     | t1         | range | PRIMARY       | PRIMARY | 4       | NULL   |    2 | Using where                     |
+----+-------------+------------+-------+---------------+---------+---------+--------+------+---------------------------------+
3 rows in set (0.00 sec)

1.5.3 MySQL執行計劃調用方式

1.EXPLAIN SELECT ……
2.EXPLAIN EXTENDED SELECT ……
  將執行計劃"反編譯"成SELECT語(yǔ)句,運行SHOW WARNINGS 可得到被MySQL優(yōu)化器優(yōu)化后的查詢(xún)語(yǔ)句
3.EXPLAIN PARTITIONS SELECT ……
  用于分區表的EXPLAIN生成QEP的信息

1.5.4 執行計劃包含的信息

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

1.5.5 id

  包含一組數字,表示查詢(xún)中執行select子句或操作表的順序

【示例一】id相同,執行順序由上至下

mysql> explain select t2.* from t1, t2, t3 where t1.id=t2.id and t1.id=t3.id and t1.name='';
+----+-------------+-------+--------+---------------+---------+---------+------------+------+--------------------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref        | rows | Extra                    |
+----+-------------+-------+--------+---------------+---------+---------+------------+------+--------------------------+
|  1 | SIMPLE      | t1    | ref    | PRIMARY,name  | name    | 63      | const      |    1 | Using where; Using index |
|  1 | SIMPLE      | t2    | eq_ref | PRIMARY       | PRIMARY | 4       | test.t1.id |    1 |                          |
|  1 | SIMPLE      | t3    | eq_ref | PRIMARY       | PRIMARY | 4       | test.t1.id |    1 | Using index              |
+----+-------------+-------+--------+---------------+---------+---------+------------+------+--------------------------+
3 rows in set (0.00 sec)

【示例二】如果是子查詢(xún),id的序號會(huì )遞增,id值越大優(yōu)先級越高,越先被執行

mysql> explain select t2.* from t2 where id = (select id from t1 where id = (select t3.id from t3 where t3.name=''));
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                               |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
|  1 | PRIMARY     | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
|  2 | SUBQUERY    | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | no matching row in const table                      |
|  3 | SUBQUERY    | t3    | ref  | name          | name | 63      |      |    1 | Using where; Using index                            |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
3 rows in set (0.00 sec)

【示例三】id如果相同,可以認為是一組,從上往下順序執行;在所有組中,id值越大,優(yōu)先級越高,越先執行

mysql> explain select t2.* from (select t3.id from t3 where t3.name='')s1, t2 where s1.id=t2.id;
+----+-------------+------------+--------+---------------+---------+---------+-------+------+--------------------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref   | rows | Extra                    |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+--------------------------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL  |    1 |                          |
|  1 | PRIMARY     | t2         | const  | PRIMARY       | PRIMARY | 4       | const |    1 |                          |
|  2 | DERIVED     | t3         | ref    | name          | name    | 63      |       |    1 | Using where; Using index |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+--------------------------+
3 rows in set (0.00 sec)

1.5.6 select_type

示查詢(xún)中每個(gè)select子句的類(lèi)型(簡(jiǎn)單OR復雜)
    a. SIMPLE:查詢(xún)中不包含子查詢(xún)或者UNION
    b. 查詢(xún)中若包含任何復雜的子部分,最外層查詢(xún)則被標記為:PRIMARY
    c. 在SELECT或WHERE列表中包含了子查詢(xún),該子查詢(xún)被標記為:SUBQUERY
    d. 在FROM列表中包含的子查詢(xún)被標記為:DERIVED(衍生)用來(lái)表示包含在from子句中的子查詢(xún)的select,mysql會(huì )遞歸執行并將結果放到一個(gè)臨時(shí)表中。服務(wù)器內部稱(chēng)為"派生表",因為該臨時(shí)表是從子查詢(xún)中派生出來(lái)的
    e. 若第二個(gè)SELECT出現在UNION之后,則被標記為UNION;若UNION包含在FROM子句的子查詢(xún)中,外層SELECT將被標記為:DERIVED
    f. 從UNION表獲取結果的SELECT被標記為:UNION RESULT

說(shuō)明:

SUBQUERY和UNION還可以被標記為DEPENDENT和UNCACHEABLE。
DEPENDENT意味著(zhù)select依賴(lài)于外層查詢(xún)中發(fā)現的數據。
UNCACHEABLE意味著(zhù)select中的某些 特性阻止結果被緩存于一個(gè)item_cache中。

【示例】

mysql> explain select d1.name, ( select id from t3) d2 from (select id,name from t1 where name='')d1 union (select name,id from t2);
+----+--------------+------------+--------+---------------+------+---------+------+------+--------------------------+
| id | select_type  | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra                    |
+----+--------------+------------+--------+---------------+------+---------+------+------+--------------------------+
|  1 | PRIMARY      | <derived3> | system | NULL          | NULL | NULL    | NULL |    0 | const row not found      |
|  3 | DERIVED      | t1         | ref    | name          | name | 63      |      |    1 | Using where; Using index |
|  2 | SUBQUERY     | t3         | index  | NULL          | age  | 5       | NULL |    6 | Using index              |
|  4 | UNION        | t2         | index  | NULL          | name | 63      | NULL |    4 | Using index              |
| NULL | UNION RESULT | <union1,4> | ALL    | NULL          | NULL | NULL    | NULL | NULL |                          |
+----+--------------+------------+--------+---------------+------+---------+------+------+--------------------------+
5 rows in set (0.00 sec)

內容說(shuō)明:

第一行:id列為1,表示第一個(gè)select,select_type列的primary表 示該查詢(xún)?yōu)橥鈱硬樵?xún),table列被標記為<derived3>,表示查詢(xún)結果來(lái)自一個(gè)衍生表,其中3代表該查詢(xún)衍生自第三個(gè)select查詢(xún),即id為3的select。
第二行:id為3,表示該查詢(xún)的執行次序為2( 4 => 3),是整個(gè)查詢(xún)中第三個(gè)select的一部分。因查詢(xún)包含在from中,所以為derived。
第三行:select列表中的子查詢(xún),select_type為subquery,為整個(gè)查詢(xún)中的第二個(gè)select。
第四行:select_type為union,說(shuō)明第四個(gè)select是union里的第二個(gè)select,最先執行。
第五行:代表從union的臨時(shí)表中讀取行的階段,table列的<union1,4>表示用第一個(gè)和第四個(gè)select的結果進(jìn)行union操作。

1.5.7 type

  表示MySQL在表中找到所需行的方式,又稱(chēng)“訪(fǎng)問(wèn)類(lèi)型”,常見(jiàn)類(lèi)型如下:

ALL, index,  range, ref, eq_ref, const, system, NULL

  從左到右,性能從最差到最好

【示例一】ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行

mysql> explain select * from t1 where email='';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

【示例二】index:Full Index Scan,index與ALL區別為index類(lèi)型只遍歷索引樹(shù)

mysql> explain select id from t1;
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | age  | 5       | NULL |    4 | Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

【示例三】range:索引范圍掃描,對索引的掃描開(kāi)始于某一點(diǎn),返回匹配值域的行。

顯而易見(jiàn)的索引范圍掃描是帶有between或者where子句里帶有<, >查詢(xún)。當mysql使用索引去查找一系列值時(shí),例如IN()和OR列表,也會(huì )顯示range(范圍掃描),當然性能上面是有差異的。

mysql> explain select * from t1 where id in (1,4);
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | range | PRIMARY       | PRIMARY | 4       | NULL |    2 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)
mysql> explain select * from t1 where id between 1 and 4;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | range | PRIMARY       | PRIMARY | 4       | NULL |    3 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)
mysql> explain select * from t1 where id=1 or id=4;       
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | range | PRIMARY       | PRIMARY | 4       | NULL |    2 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.01 sec)
mysql> explain select * from t1 where id > 1;      
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | range | PRIMARY       | PRIMARY | 4       | NULL |    3 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)

【示例四】ref:使用非唯一索引掃描或者唯一索引的前綴掃描,返回匹配某個(gè)單獨值的記錄行

mysql> explain select * from t1 where name='guo';
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
|  1 | SIMPLE      | t1    | ref  | name          | name | 63      | const |    1 | Using where |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)

【示例五】eq_ref:類(lèi)似ref,區別就在使用的索引是唯一索引,對于每個(gè)索引鍵值,表中只有一條記錄匹配,簡(jiǎn)單來(lái)說(shuō),就是多表連接中使用primary key或者 unique key作為關(guān)聯(lián)條件。

mysql> explain select t1.name from t1, t2 where t1.id=t2.id;
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref        | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
|  1 | SIMPLE      | t1    | index  | PRIMARY       | name    | 63      | NULL       |    4 | Using index |
|  1 | SIMPLE      | t2    | eq_ref | PRIMARY       | PRIMARY | 4       | test.t1.id |    1 | Using index |
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
2 rows in set (0.00 sec)

【示例六】const、system:當MySQL對查詢(xún)某部分進(jìn)行優(yōu)化,并轉換為一個(gè)常量時(shí),使用這些類(lèi)型訪(fǎng)問(wèn)。

  如將主鍵置于where列表中,MySQL就能將該查詢(xún)轉換為一個(gè)常量

mysql> explain select * from ( select * from t1 where id=1)b1;
+----+-------------+------------+--------+---------------+---------+---------+------+------+-------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref  | rows | Extra |
+----+-------------+------------+--------+---------------+---------+---------+------+------+-------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL |    1 |       |
|  2 | DERIVED     | t1         | const  | PRIMARY       | PRIMARY | 4       |      |    1 |       |
+----+-------------+------------+--------+---------------+---------+---------+------+------+-------+
2 rows in set (0.00 sec)

  *注:*system是const類(lèi)型的特例,當查詢(xún)的表只有一行的情況下,使用system

【示例七】NULL:MySQL在優(yōu)化過(guò)程中分解語(yǔ)句,執行時(shí)甚至不用訪(fǎng)問(wèn)表或索引, 例如從一個(gè)索引列里選取最小值可以通過(guò)單獨索引查找完成。

mysql> explain select * from t1 where id = (select min(id) from t2);
+----+-------------+-------+-------+---------------+---------+---------+-------+------+------------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra                        |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+------------------------------+
|  1 | PRIMARY     | t1    | const | PRIMARY       | PRIMARY | 4       | const |    1 |                              |
|  2 | SUBQUERY    | NULL  | NULL  | NULL          | NULL    | NULL    | NULL  | NULL | Select tables optimized away |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+------------------------------+
2 rows in set (0.00 sec)

1.5.8 possible_keys

  指出MySQL能使用哪個(gè)索引在表中找到記錄,查詢(xún)涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢(xún)使用

1.5.9 key

  顯示MySQL在查詢(xún)中實(shí)際使用的索引,若沒(méi)有使用索引,顯示為NULL

【示例】

mysql> explain select id,age from t1;
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | age  | 5       | NULL |    4 | Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

1.5.10 key_len

  表示索引中使用的字節數,可通過(guò)該列計算查詢(xún)中使用的索引的長(cháng)度(key_len顯示的值為索引字段的最大可能長(cháng)度,并非實(shí)際使用長(cháng)度,即key_len是根據表定義計算而得,不是通過(guò)表內檢索出的)。

1.5.11 ref

  表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值。

1.5.12 rows

  表示MySQL根據表統計信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數。

【示例】

mysql> explain select * from t1 , t2 where t1.id=t2.id and t2.name='atlas';
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref        | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
|  1 | SIMPLE      | t2    | ref    | PRIMARY,name  | name    | 63      | const      |    1 | Using where |
|  1 | SIMPLE      | t1    | eq_ref | PRIMARY       | PRIMARY | 4       | test.t2.id |    1 |             |
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
2 rows in set (0.00 sec)

1.5.13 Extra

  包含不適合在其他列中顯示但十分重要的額外信息

【示例一】Using index

該值表示相應的select操作中使用了覆蓋索引(Covering Index)

mysql> explain select id from t1;
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | age  | 5       | NULL |    4 | Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

    覆蓋索引(Covering Index)

    MySQL可以利用索引返回select列表中的字段,而不必根據索引再次讀取數據文件

    包含所有滿(mǎn)足查詢(xún)需要的數據的索引稱(chēng)為覆蓋索引(Covering Index)

    注意:如果要使用覆蓋索引,一定要注意select列表中只取出需要的列,不可select *,因為如果將所有字段一起做索引會(huì )導致索引文件過(guò)大,查詢(xún)性能下降

【示例二】Using where

  表示mysql服務(wù)器將在存儲引擎檢索行后再進(jìn)行過(guò)濾。許多where條件里涉及索引中的列,當(并且如果)它讀取索引時(shí),就能被存儲引擎檢驗,因此不是所有帶where字句的查詢(xún)都會(huì )顯示"Using where"。

  有時(shí)"Using where"的出現就是一個(gè)暗示:查詢(xún)可受益與不同的索引。

mysql> explain select id,name from t1 where id<4;
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | t1    | index | PRIMARY       | name | 63      | NULL |    4 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
1 row in set (0.00 sec)

【示例三】Using temporary

  表示MySQL需要使用臨時(shí)表來(lái)存儲結果集,常見(jiàn)于排序和分組查詢(xún)

  這個(gè)值表示使用了內部臨時(shí)(基于內存的)表。一個(gè)查詢(xún)可能用到多個(gè)臨時(shí)表。有很多原因都會(huì )導致MySQL在執行查詢(xún)期間創(chuàng )建臨時(shí)表。兩個(gè)常見(jiàn)的原因是在來(lái)自不同表的上使用了DISTINCT,或者使用了不同的ORDER BY和GROUP BY列??梢詮娭浦付ㄒ粋€(gè)臨時(shí)表使用基于磁盤(pán)的MyISAM存儲引擎。這樣做的原因主要有兩個(gè):

    1)內部臨時(shí)表占用的空間超過(guò)min(tmp_table_size,max_heap_table_size)系統變量的限制

    2)使用了TEXT/BLOB 列

mysql> explain select id from t1 where id in (1,2) group by age,name;
+----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                                        |
+----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------+
|  1 | SIMPLE      | t1    | range | PRIMARY       | PRIMARY | 4       | NULL |    2 | Using where; Using temporary; Using filesort |
+----+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------+
1 row in set (0.00 sec)

【示例四】Using filesort

  MySQL中無(wú)法利用索引完成的排序操作稱(chēng)為“文件排序”

mysql> explain select id,age from t1 order by name; 
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)
mysql> explain select id,age from t1 order by age; 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | age  | 5       | NULL |    4 | Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

【示例五】Using join buffer

  該值強調了在獲取連接條件時(shí)沒(méi)有使用索引,并且需要連接緩沖區來(lái)存儲中間結果。

  如果出現了這個(gè)值,那應該注意,根據查詢(xún)的具體情況可能需要添加索引來(lái)改進(jìn)能。

mysql> explain select t1.name from t1 inner join t2 on t1.name=t2.name;
+----+-------------+-------+-------+---------------+------+---------+--------------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref          | rows | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+--------------+------+--------------------------+
|  1 | SIMPLE      | t1    | index | name          | name | 63      | NULL         |    4 | Using index              |
|  1 | SIMPLE      | t2    | ref   | name          | name | 63      | test.t1.name |    2 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+--------------+------+--------------------------+
2 rows in set (0.00 sec)

刪除t1索引

mysql> alter table t1 drop key name;                                   
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

刪除t2索引

mysql> alter table t2 drop key name; 
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

經(jīng)常查找

mysql> explain select t1.name from t1 inner join t2 on t1.name=t2.name;
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                          |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
|  1 | SIMPLE      | t1    | ALL  | NULL          | NULL | NULL    | NULL |    4 |                                |
|  1 | SIMPLE      | t2    | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where; Using join buffer |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
2 rows in set (0.00 sec)

【示例六】Impossible where

  這個(gè)值強調了where語(yǔ)句會(huì )導致沒(méi)有符合條件的行。

mysql> EXPLAIN SELECT * FROM t1 WHERE 1=2;
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra            |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
1 row in set (0.00 sec)

【示例七】Select tables optimized away

  這個(gè)值意味著(zhù)僅通過(guò)使用索引,優(yōu)化器可能僅從聚合函數結果中返回一行.

mysql> explain select max(id) from t1;
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                        |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
1 row in set (0.00 sec)

【示例八】Index merges

  當MySQL 決定要在一個(gè)給定的表上使用超過(guò)一個(gè)索引的時(shí)候,就會(huì )出現以下格式中的一個(gè),詳細說(shuō)明使用的索引以及合并的類(lèi)型。

Using sort_union(...)
Using union(...)
Using intersect(...)

1.5.14 小結

  EXPLAIN不會(huì )告訴你關(guān)于觸發(fā)器、存儲過(guò)程的信息或用戶(hù)自定義函數對查詢(xún)的影響情況。

  EXPLAIN不考慮各種Cache。

  EXPLAIN不能顯示MySQL在執行查詢(xún)時(shí)所作的優(yōu)化工作。

  部分統計信息是估算的,并非精確值。

  EXPALIN只能解釋SELECT操作,其他操作要重寫(xiě)為SELECT后查看執行計劃。

1.6 mysql不走索引的原因

1.6.1 一些常見(jiàn)的原因

  1) 沒(méi)有查詢(xún)條件,或者查詢(xún)條件沒(méi)有建立索引

  2) 在查詢(xún)條件上沒(méi)有使用引導列

  3) 查詢(xún)的數量是大表的大部分,應該是30%以上。

  4) 索引本身失效

  5) 查詢(xún)條件使用函數在索引列上,或者對索引列進(jìn)行運算,運算包括(+,-,*,/,! 等)

    錯誤的例子:select * from test where id-1=9; 正確的例子:select * from test where id=10;

  6) 對小表查詢(xún)

  7) 提示不使用索引

  8) 統計數據不真實(shí)

  9) CBO計算走索引花費過(guò)大的情況。其實(shí)也包含了上面的情況,這里指的是表占有的block要比索引小。

  10)隱式轉換導致索引失效.這一點(diǎn)應當引起重視.也是開(kāi)發(fā)中經(jīng)常會(huì )犯的錯誤.

    由于表的字段tel_num定義為varchar2(20),但在查詢(xún)時(shí)把該字段作為number類(lèi)型以where條件傳給數據庫,這樣會(huì )導致索引失效.

      錯誤的例子:select * from test where tel_nume=13333333333;

      正確的例子:select * from test where tel_nume='13333333333';

  11) 注意使用的特殊符號

    1,<> ,!=

     2,單獨的>,<,(有時(shí)會(huì )用到,有時(shí)不會(huì ))

  12)like "%_" 百分號在前.

      select * from t1 where name like 'linux培訓%';

  13) not in ,not exist.

  14) in 盡量改成 union 。

  15)當變量采用的是times變量,而表的字段采用的是date變量時(shí).或相反情況。

  16)B-tree索引is null不會(huì )走,is not null會(huì )走,位圖索引 is null,is not null 都會(huì )走 。

  17)聯(lián)合索引 is not null 只要在建立的索引列(不分先后)都會(huì )走,

  in null時(shí) 必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時(shí),其他建立索引的列可以是is null(但必須在所有列 都滿(mǎn)足is null的時(shí)候),或者=一個(gè)值;

  當建立索引的第一位置是=一個(gè)值時(shí),其他索引列可以是任何情況(包括is null =一個(gè)值),以上兩種情況索引都會(huì )走。其他情況不會(huì )走。

1.6.2 需要注意的一些

1)    MyISAM 存儲引擎索引鍵長(cháng)度總和不能超過(guò)1000 字節;
2)    BLOB 和TEXT 類(lèi)型的列只能創(chuàng  )建前綴索引;
3)    MySQL 目前不支持函數索引;
4)    使用不等于(!= 或者<>)的時(shí)候MySQL 無(wú)法使用索引;
5)    過(guò)濾字段使用了函數運算后(如abs(column)),MySQL 無(wú)法使用索引;
6)    Join 語(yǔ)句中Join 條件字段類(lèi)型不一致的時(shí)候MySQL 無(wú)法使用索引;
7)    使用LIKE 操作的時(shí)候如果條件以通配符開(kāi)始( '%abc...')MySQL 無(wú)法使用索引;
8)    使用非等值查詢(xún)的時(shí)候MySQL 無(wú)法使用Hash 索引;
9)    在我們使用索引的時(shí)候,需要注意上面的這些限制,尤其是要注意無(wú)法使用索引的情況,因為這很容易讓我們因為疏忽而造成極大的性能隱患。

1.7 數據庫索引的設計原則

  為了使索引的使用效率更高,在創(chuàng )建索引時(shí),必須考慮在哪些字段上創(chuàng )建索引和創(chuàng )建什么類(lèi)型的索引。

1.7.1 那么索引設計原則又是怎樣的

1.選擇唯一性索引

  唯一性索引的值是唯一的,可以更快速的通過(guò)該索引來(lái)確定某條記錄。

  例如,學(xué)生表中學(xué)號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個(gè)學(xué)生的信息。如果使用姓名的話(huà),可能存在同名現象,從而降低查詢(xún)速度。

2.為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引

  經(jīng)常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作會(huì )浪費很多時(shí)間。

如果為其建立索引,可以有效地避免排序操作。

3.為常作為查詢(xún)條件的字段建立索引

  如果某個(gè)字段經(jīng)常用來(lái)做查詢(xún)條件,那么該字段的查詢(xún)速度會(huì )影響整個(gè)表的查詢(xún)速度。因此,

  為這樣的字段建立索引,可以提高整個(gè)表的查詢(xún)速度。

4.限制索引的數目

  索引的數目不是越多越好。每個(gè)索引都需要占用磁盤(pán)空間,索引越多,需要的磁盤(pán)空間就越大。修改表時(shí),對索引的重構和更新很麻煩。越多的索引,會(huì )使更新表變得很浪費時(shí)間。

5.盡量使用數據量少的索引

  如果索引的值很長(cháng),那么查詢(xún)的速度會(huì )受到影響。例如,對一個(gè)CHAR(100)類(lèi)型的字段進(jìn)行全文檢索需要的時(shí)間肯定要比對CHAR(10)類(lèi)型的字段需要的時(shí)間要多。

6.盡量使用前綴來(lái)索引

  如果索引字段的值很長(cháng),最好使用值的前綴來(lái)索引。例如,TEXT和BLOG類(lèi)型的字段,進(jìn)行全文檢索會(huì )很浪費時(shí)間。如果只檢索字段的前面的若干個(gè)字符,這樣可以提高檢索速度。

7.刪除不再使用或者很少使用的索引

  表中的數據被大量更新,或者數據的使用方式被改變后,原有的一些索引可能不再需要。數據庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

8.小表不應建立索引

  包含大量的列并且不需要搜索非空值的時(shí)候可以考慮不建索引

1.8 參考文獻

https://baike.baidu.com/item/數據庫索引/8751686?fr=aladdin
https://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx
http://blog.csdn.net/woshiqjs/article/details/24135495
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MySQL數據庫Query的優(yōu)化
MySQL優(yōu)化(三) MySQL 卓越資源
MYSQL語(yǔ)句調優(yōu):MYSQL Explain 執行計劃輸出詳解
添加mysql索引的3條原則
我的MYSQL學(xué)習心得(十六) 優(yōu)化
MySQL性能分析及explain的使用說(shuō)明
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久