索引

suaxi
2020-11-04 / 0 评论 / 171 阅读 / 正在检测是否收录...
MySQl官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干:就可以得到索引的本质:索引是数据结构。

1、索引的分类

在一个表中,主键索引只能有一个,唯一索引可以有多个
  • 主键索引 (PRIMARY KEY)

    • 唯一的标识,主键不可重复,只能有一个列作为主键
  • 唯一索引 (UNIQUE KEY)

    • 避免重复的列出现,唯一索引可以重复,多个列都可以标识为 唯一索引
  • 常规索引(KEY/INDEX)

    -默认的,通过index,key关键字来设置

  • 全文索引(FullText)

    • 在特定的数据库引擎下才有,MyISAM
    • 快速定位数据

基础语法

-- 索引的使用
-- 1、在创建表的时候给字段增加索引
-- 2、创建完毕后,增加索引


-- 显示所有的索引信息
SHOW INDEX FROM account;

-- 增加一个全文索引 (索引名) 列名
ALTER TABLE shop.account ADD FULLTEXT INDEX `name`(`name`);

-- EXPLAIN 分析sql执行的状况
EXPLAIN SELECT * FROM account;  -- 非全文索引

EXPLAIN SELECT * FROM account WHERE MATCH(name) AGAINST('a');

2、测试索引

CREATE TABLE `test_user`(
    id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(50) DEFAULT '' COMMENT '用户名',
    email VARCHAR(50) NOT NULL COMMENT '邮箱',
    phone VARCHAR(50) DEFAULT '' COMMENT '手机号',
    gender TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男,1:女)',
    passwd 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=utf8 COMMENT '用户表';


-- 插入100万数据
DELIMITER $$ -- 写函数之前必须要写,用作标志

CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
    DECLARE num INT DEFAULT 1000000;
    DECLARE i INT DEFAULT 0;
    
    WHILE i<num DO
        -- 插入语句
        INSERT INTO test_user(`name`,`email`,`phone`,`gender`,`passwd`,`age`)
        VALUES(CONCAT('用户',i),'281463547@qq.com',
        CONCAT('13',FLOOR(RAND()*((999999999-1000000)+1000000))),
        FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100));
        SET i=i+1;
    END WHILE;
    RETURN i;
END;

SELECT mock_data();

SELECT * FROM test_user WHERE `name` = '用户19998';  -- 查询时间3.622s
SELECT * FROM test_user WHERE `name` = '用户19998';  -- 查询时间2.349s

EXPLAIN SELECT * FROM test_user WHERE `name` = '用户19998'; -- rows 992262

-- id_表名_字段名
-- 语法: CREATE INDEX 索引名 ON 表(字段名)
CREATE INDEX id_test_user_name ON test_user(`name`);  -- 创建用时18.442s

SELECT * FROM test_user WHERE `name` = '用户19998'; -- 创建索引后查询用时0.028s
SELECT * FROM test_user WHERE `name` = '用户19998'; -- 0.026s

EXPLAIN SELECT * FROM test_user WHERE `name` = '用户19998'; -- rows 1

image-20201104115736430.png

注:索引在小数据量的时候用处不大,但在大数据的时候,区别十分明显

3、索引原则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在经常查询的字段上
索引的数据结构

Hash类型的索引

BTree:InnoDB的默认数据结构

0

评论 (0)

取消