1. 程式人生 > 其它 >11-MySQL-索引的分類、測試索引、索引原則

11-MySQL-索引的分類、測試索引、索引原則

技術標籤:MySQLmysql索引

MySQL -> 索引 -> 索引的分類、測試索引、索引原則

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

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

1. 索引的分類

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

  • 主鍵索引 PRIMARY KEY

    • 唯一的標識,主鍵不可重複,只能有一個列作為主鍵
  • 唯一索引 UNIQUE KEY

    • 避免重複的列出現,唯一索引可以重複,多個列都可以標誌為唯一索引
  • 常規索引 KEY/INDEX

    • 預設的,index,key關鍵字來設定
  • 全文索引 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('A')
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萬資料 DELIMITER $$ -- 寫函式之前必須要寫,標誌 CREATE FUNCTION mock_date() RETURNS INT 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_date(); SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.530 sec SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.499 sec SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.483 sec EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999'; CREATE INDEX id_app_user_name ON app_user(`name`); SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.010 sec SELECT * FROM app_user WHERE `name` = '使用者9999'; -- 0.001 sec EXPLAIN SELECT * FROM app_user WHERE `name` = '使用者9999';

在這裡插入圖片描述在這裡插入圖片描述

  • 索引在小資料量的時候,用處不大;但在大資料量的情況下,區別十分明顯。
3. 索引原則
  • 索引不是越多越好
  • 不要對經常變動資料加索引
  • 小資料量的表不需要加索引
  • 索引一般加在常用來查詢的欄位上

索引的資料結構

BTREE :INNODB預設的資料結構

學習:MySQL索引背後的資料結構及演算法原理