IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 「Mysql」数据库索引,百万数据测试索引效果 -> 正文阅读

[大数据]「Mysql」数据库索引,百万数据测试索引效果

Mysql官方对索引的定义是:索引(index)是帮助Mysql高效获取数据的数据结构。进而,我们可以知道索引的本质是数据结构。

一、索引的分类

  • 主键索引:也就是我们常见的 PRIMARY KEY,只有一个列作为主键,唯一标识,不可重复。
  • 唯一索引:UNIQUE KEY,避免重复的列出现,唯一索引是可以有多个,同一张表里的多个列都可以设置唯一索引。
  • 常规索引:KEY/INDEX,默认的类型,通过关键字INDEX或者KEY来设置。
  • 全文索引:FullText,在特定的数据库引擎下才支持,作用是快速定位数据。

二、使用索引

在创建表或者创建之后,都可以给字段增加索引。

比如现在创建一个测试用的表,我先在创建的时候加了前三种类型的索引:

--?创建表
CREATE?TABLE?`student`(
?`StudentNo`?INT(4)?NOT?NULL?COMMENT?"学号",
?`LoginPwd`?VARCHAR(20)?DEFAULT?NULL,
?`StudentName`?VARCHAR(20)?DEFAULT?NULL?COMMENT?"学生姓名",
?`Sex`?TINYINT(1)?DEFAULT?NULL?COMMENT?"性别:0-1",
?`GradeId`?INT(11)?DEFAULT?NULL?COMMENT?"年纪编号",
?`Phone`?VARCHAR(50)?NOT?NULL?COMMENT?"联系电话",
?`Address`?VARCHAR(255)?NOT?NULL?COMMENT?"地址",
?`BornDate`?DATETIME?DEFAULT?NULL?COMMENT?"出生日期",
?`Email`?VARCHAR(50)?NOT?NULL?COMMENT?"邮箱",
?`IdentityCard`?VARCHAR(18)?DEFAULT?NULL?COMMENT?"身份证号",
?PRIMARY?KEY?(`StudentNo`),?--?主键索引
?UNIQUE?KEY?`IdentityCard`?(`IdentityCard`),?--?唯一索引,前面是索引名称,括号里是字段名
?KEY?`Email`?(`Email`)?--?常规索引
)ENGINE=INNODB?DEFAULT?CHARSET=utf8;

执行sql,创建表成功。这时候我继续增加一个全文索引。

--?增加一个全文索引类型,前面是索引名称,括号里是字段名
ALTER?TABLE?`school`.`student`?ADD?FULLTEXT?INDEX?`StudentName`?(`StudentName`);

可以查看student表的所有索引SHOW INDEX FROM student;

「Mysql」数据库索引,百万数据测试索引效果

还有第三种,CREATE INDEX 索引名 on 表(字段),到后面演示。

三、百万数据测试索引效果

1. 再来创建个测试表

--?创建表
CREATE?TABLE?`app_user`(
?`id`?BIGINT(20)?UNSIGNED?NOT?NULL?AUTO_INCREMENT,
?`name`?VARCHAR(50)?DEFAULT?''?COMMENT?'昵称',
?`email`?VARCHAR(50)?DEFAULT?NULL?COMMENT?"邮箱",
?`phone`?VARCHAR(20)?DEFAULT?NULL?COMMENT?"手机号",
?`gender`?TINYINT(4)?DEFAULT?NULL?COMMENT?"性别?0-男,?1-女",
?`password`?VARCHAR(100)?NOT?NULL?COMMENT?"密码",
?`age`?TINYINT(4)?NOT?NULL?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='app用户表';

执行创建成功,现在插入数据。

2. 插入数据

--?插入百万数据
DELIMITER?$$
CREATE?FUNCTION?mock_data()
RETURNS?INT

BEGIN
?DECLARE?num?INT?DEFAULT?1000000;
?DECLARE?i?INT?DEFAULT?0;

?WHILE?i?<?num?DO
????????--?插入语句
????????INSERT?INTO?`school`.`app_user`(`name`,`email`,`phone`,`gender`,`password`,`age`)VALUES
????????(CONCAT('用户',i),?'123456@qq.com',?CONCAT('18',?FLOOR(RAND()*((999999999-100000000)+100000000))),
????????FLOOR(RAND()*2),?UUID(),?FLOOR(RAND()*100));
??SET?i?=?i+1;
?END?WHILE;
?RETURN?i;

END;

执行可能会出现This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary报错。

如果出现,可以先执行set global log_bin_trust_function_creators=TRUE?,然后再试下。

执行成功后,再执行:

SELECT?mock_data();

大概持续1分钟左右,别急。

「Mysql」数据库索引,百万数据测试索引效果

3. 测试查询

未加索引

查询一条数据。

SELECT?*?FROM?`app_user`?WHERE?`name`='用户9999'

多次执行查询,发现花费时间,稳定在0.63s左右,这个从点击执行到看到结果,已经从肉眼可以感知有点慢了。

「Mysql」数据库索引,百万数据测试索引效果

我们可以增加关键词EXPLAIN分析sql执行的情况。

EXPLAIN?SELECT?*?FROM?`app_user`?WHERE?`name`='用户9999'

可以看到这个语句查了99W+条,这都是时间消耗。

「Mysql」数据库索引,百万数据测试索引效果

添加索引?用上面说的第三种方式,增加一个常规索引。

CREATE?INDEX?id_app_user_name?ON?app_user(`name`);

再重新执行下查询:

SELECT?*?FROM?`app_user`?WHERE?`name`='用户9999'

查询时间大幅缩短,只需要要0.1s+。

「Mysql」数据库索引,百万数据测试索引效果

再分析下加了索引后的查询。

EXPLAIN?SELECT?*?FROM?`app_user`?WHERE?`name`='用户9999'

「Mysql」数据库索引,百万数据测试索引效果

只查了一条,精准查询。

三、索引使用原则

索引虽然好用,但是不可以滥用,这里有几个原则可以记一下:

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

以上就是对索引的简单介绍,但是MySQL索引背后的数据结构及算法原理,东西可就多了

资料获取方式
https://docs.qq.com/doc/DQVZmeHpBdWJBeXpi

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:53:31  更:2021-12-13 12:56:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:08:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码