1. 程式人生 > 其它 >MySQL筆記7:索引

MySQL筆記7:索引

7. 索引

Msql官方對索引的定義為:索引(index)是幫助MySQL高效獲取資料的資料結構

提取句子主幹,就可以得到索引的本質:索引是資料結構。

7.1 索引的分類

主鍵索引只能有一個, 唯一索引可以有多個

  • 主鍵索引 (primary key)
    • 唯一標識,主鍵不可重複,只能有一個列作為主鍵
  • 唯一索引 (unique key)
    • 避免列中出現重複的資料,唯一索引可以有多個,多個列都可以標識為唯一索引
  • 常規索引(key / index)
    • 預設的,可以使用key / index關鍵字設定
  • 全文索引 (FullText)
    • 在特定的資料庫下才有,MyISAM
    • 快速定位資料

基礎語法

-- 索引的使用
-- 1. 在建立表的時候給欄位增加索引
-- 2. 建立完畢後,增加索引

-- 顯示所有的索引資訊
SHOW INDEX FROM student;

-- 增加一個索引 索引名(列名)
ALTER TABLE school.student ADD FULLTEXT INDEX studentName(studentName);

-- explain 分析sql執行的狀況
EXPLAIN SELECT * FROM student; -- 非全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST('李');

explain用法

7.2 測試索引

在小資料中用處不大,在大資料時效果明顯

建表

CREATE TABLE `app_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '' COMMENT '使用者暱稱',
`email` VARCHAR(50) NOT NULL COMMENT '使用者郵箱',
`phone` VARCHAR(20) DEFAULT '' COMMENT '手機號',
`gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性別(0:男;1:女)',
`password` VARCHAR(100) NOT NULL COMMENT '密碼',
`age` TINYINT(4) DEFAULT '0' COMMENT '年齡',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app使用者表'

插入100萬條資料

-- 插入100w條資料
DROP FUNCTION IF EXISTS mock_data;
DELIMITER $$  --  寫函式之前必寫,標誌
-- 建立函式
CREATE FUNCTION mock_data()
RETURNS INT
DETERMINISTIC -- 8.0需要新增

BEGIN
    DECLARE num INT DEFAULT 1000000;
    DECLARE i INT DEFAULT 0;
    WHILE i < num DO
        INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`)
        VALUES(CONCAT('使用者', i), '[email protected]', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
        SET i = i + 1;
    END WHILE;
    RETURN i;
END $$ -- 建立函式
SELECT mock_data();  -- 執行函式

直接查詢

SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 1.058
EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999';  -- 檢視執行狀態

需要查詢資料的數量:rows

構建索引後查詢

建立索引,為資料構造了一顆新的樹

建立索引:CREATE INDEX 索引名 on 表(欄位)

索引名:id_表名_欄位名

CREATE INDEX id_app_user_name ON app_user(`name`); -- 建立索引,新建一顆樹

SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.001 sec
EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999'; 

需要查詢的數量:rows

7.3 索引原則

  • 索引不是越多越好(佔用空間
  • 不要對程序變動的資料加索引(頻繁刪改
  • 小數量的表不需要加索引
  • 索引一般加在常用來查詢的欄位上

索引的資料結構

預設建立時:Hash型別的索引

InnoDB預設資料結構:Btree/B-tree(B+樹)