MySQL基礎優化之索引管理

MySQL數據庫中索引的類型介紹

 
  • BTREE:B+樹索引 (平常所見大部分爲此種索引)
  • HASH:HASH索引
  • FULLTEXT:全文索引
  • RTREE:R樹索引
 
MySQL索引管理
  • 索引創建在表的列上(字段)的。
  • 在where後面的列創建索引纔會加快查詢速度。
  • pages<---索引(屬性)<----查數據。
  • 索引分類:
  主鍵索引
  普通索引
  惟一索引
 
 

添加索引和刪除索引的兩種方式

 
第一種:
alter table test add index index_name(name);
alter table test drop index idx_name;

  

 
第二種:
create index index_name on test(name);
drop index idx_stu_name on t1;

  

查看索引的兩種方式

 
第一種方式:
mysql> desc t1;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(5)      | YES  |     | NULL    |       |
| stu_name | varchar(20) | YES  | MUL | NULL    |       |
| age      | int(3)      | YES  |     | 28      |       |
+----------+-------------+------+-----+---------+-------+

  

 
第二種方式:
mysql> show index from t1\G;
*************************** 1. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: idx_stu_name
 Seq_in_index: 1
  Column_name: stu_name
    Collation: A
  Cardinality: 5
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

第二種方式的好處就是能夠查看到索引的名稱,索引的類型爲BTREE索引,便於刪除索引時指定刪除哪一個索引。javascript

 
 

用explain查看SQL的執行計劃

mysql> select * from t1;
+------+----------+------+
| id   | stu_name | age  |
+------+----------+------+
|    1 | tom      |   28 |
|    2 | liliy    |   28 |
|    3 | lucy     |   28 |
|    4 | lintao   |   28 |
|    5 | alex     |   28 |
+------+----------+------+
5 rows in set (0.00 sec)

mysql> show index from t1\G;
*************************** 1. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: idx_stu_name
 Seq_in_index: 1
  Column_name: stu_name
    Collation: A
  Cardinality: 5
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

#  只有stu_name這一列有索引

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

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

由上述可知因爲t1表只有一個stu_name列由索引,用id來查詢的屬於全表掃描,由於類型爲:ALL,而用stu_name查找時則命中了索引,類型爲: refjava

 
 

MySQL中的約束索引

1. 主鍵索引:只能有一個主鍵。

  • 主鍵索引:列的內容是惟一值,高中學號.
  • 表建立的時候至少要有一個主鍵索引,最好和業務無關。
  • 走主鍵索引的查詢效率是最高的,咱們儘可能每張表都有一個主鍵,而且未來查詢的時候最好能用主鍵進行查詢。
 
建立主鍵的方式:
 
1. 建表時建立
CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

  

 
2. 創建表後建立
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;

  

2. 普通索引

  • 加快查詢速度,工做中優化數據庫的關鍵。
  • 在合適的列上創建索引,讓數據查詢更高效。
create index index_name on test(name);
alter table test add index index_name(name);

用了索引,查一堆內容。mysql

在where條件關鍵字後面的列創建索引纔會加快查詢速度.sql

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

三、惟一索引

內容惟一,但不是主鍵。
須要在普通索引前面加一個unique
 
create unique index index_name on test(name);

  

 

4. 前綴索引

含義:根據字段的前N個字符創建索引。
存在的緣由是由於索引在創建的時候通常會把自動對當前列進行排序。若是該列的字符列特別長,那麼建索引排序會很是耗時,同時索引也會很是的大,索引咱們會選該列前幾個字符建立索引。
 
create index index_name on test(name(8));

  

5. 聯合索引

含義:多個字段創建一個索引
 
where a女生 and b身高165 and c身材好
index(a,b,c)
特色:前綴生效特性。
a,ab,abc  能夠走索引(必須以a開頭)。
b ac bc c 不走索引。
原則:把最經常使用來做爲條件查詢的列放在前面。
 
走索引:
select * from people where a='nv' and b>=165 and tizhong<=120;
select * from people where a='nv' and b>=165;
select * from people where a='nv';
select * from people where a='nv' and tizhong<=120;
 
alter table test add index union_idx_name(name, age, gender);

  

 6. 聯合主鍵是聯合索引的特殊形式

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

   

7. 前綴加聯合索引

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

索引的企業應用場景(1)

 
企業SQL優化思路:
一、把一個大的不使用索引的SQL語句按照功能進行拆分
二、長的SQL語句沒法使用索引,能不能變成2條短的SQL語句讓它分別使用上索引。
三、對SQL語句功能的拆分和修改
四、減小「爛」SQL
  –  由運維(DBA)和開發交流(確認),共同肯定如何改,最終由DBA執行
五、制定開發流程 
 
 

索引的企業應用場景(2)

 
不適合走索引的場景:
一、惟一值少的列上不適合創建索引或者創建索引效率低。例如:性別列
二、小表能夠不創建索引,100條記錄。
三、對於數據倉庫,大量全表掃描的狀況,建索引反而會慢
查看錶的惟一值數量:
select count(distinct user) from mysql.user; select count(distinct user,host) from mysql.user;

  

 

索引的企業應用場景(3)

 
建索引流程:
一、找到慢SQL。
   show processlist;
   記錄慢查詢日誌。
 
二、explain select句,條件列多。
 
三、查看錶的惟一值數量:
select count(distinct user) from mysql.user; select count(distinct user,host) from mysql.user;
條件列多。能夠考慮創建聯合索引。
 
四、創建索引(流量低谷)
force index
 
五、拆開語句(和開發)。
 
六、like '%%' 不用mysql  
相關文章
相關標籤/搜索