索引的基礎使用

索引:

分類:

  1. 功能邏輯:普通索引、唯一索引、主鍵索引、全文索引
  2. 物理實現方式:聚簇索引,非聚簇索引
  3. 作用字段個數:單列索引,聯合索引

索引創建:

--主鍵索引
CREATE TABLE dept(
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(20)
);
--emp_name 唯一索引,emp_dept_id 外鍵
CREATE TABLE emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20) UNIQUE,
dept_id INT,
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
)

查看錶索引:

show index from book;

Non_unique :0(唯一索引),1(不是唯一索引)

性能分析:

EXPLAIN SELECT * from book where book_name = 'mysql高級'

唯一索引(unique): 插入的數據不能重複,但是可插入索引字段爲null,且可重複多次

主鍵索引(primary key):可以刪除主鍵索引,如果主鍵索引有Auto_increment約束字段的唯一索引則不能刪除;

  1. 設定爲主鍵後數據庫會自動建立索引,innodb爲聚簇索引
  2. 修改主鍵索引:必須先刪除掉(drop)原索引,再新建(add)索引
alter table xxxx DROP PRIMARY KEY

聯合索引:具有最左原則

CREATE TABLE test3(
id INT(11) NOT NULL,
name CHAR(30) NOT NULL,
age INT(11) NOT NULL,
info VARCHAR(255),
INDEX multi_idx(id,name,age)
);

img

聯合索引的順序嚴格按照創建時順序執行。

聯合索引的具體體現:

EXPLAIN SELECT * from test3 where  id = 10001 and age = 22;

EXPLAIN SELECT * from test3 where  age = 22

img

img

由上述解釋器可以看出,第一條sql執行,由索引參與,但第二條sql略過id直接查詢name,則聯合索引失效

possible_keys:

  • 查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用

key:實際使用的索引,如果爲NULL,則沒有使用索引

simple:簡單SELECT(不使用UNION或子查詢等)

index_type:存儲引擎類型

創建普通表:索引的其他設置方式

CREATE TABLE test4 (
	id INT ( 11 ) NOT NULL,
	NAME CHAR ( 30 ) NOT NULL,
	age INT ( 11 ) NOT NULL,
	info VARCHAR ( 255 )
)
--創建單列索引
alter table test4 add  index idx(id);
--創建唯一索引
ALTER TABLE test4 add UNIQUE index uk_idx_name(name);
--創建聯合索引
ALTER TABLE test4 add index mul_id_name_info(id,name);
--創建主鍵索引
alter table test4 add PRIMARY KEY idx_pri(id)

刪除索引及新特性

--刪除索引
ALTER table book1 drop index uk_idk_cmt;
--刪除索引中的字段(可將聯合索引降至單列索引)
alter table test3 drop COLUMN name

支持降序索引和隱藏索引

MySQL8.0之前創建的索引是升序索引,使用時反向掃描,效率低;MySQL8.0之後支持降序索引。

CREATE TABLE ts1(a int,b int,index idx_a_b(a,b desc));

show create table ts1;

--結果看:索引已經是降序了
-- ts1	CREATE TABLE `ts1` (
--   `a` int DEFAULT NULL,
--   `b` int DEFAULT NULL,
--   KEY `idx_a_b` (`a`,`b` DESC)
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

隱藏索引:軟刪除(invisible(不可見性),visible(可見性)),如果設置的隱藏索引對系統無影響,則可刪除該索引;

主鍵不能被設置爲隱藏索引當表中沒有顯式主鍵時,表中第一個唯一非空索引會成爲隱式主鍵,也不能設置爲隱藏索引。

注意:當索引被隱藏時,它的內容仍然是和正常索引一樣實時更新的。如果一個索引需要長期被隱藏,那麼可以將其刪除,因爲索引的存在會影響插入、更新和刪除的性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章