知识点:Mysql 索引原理完全手册(1)

知识点:Mysql 索引原理完全手册(2)

知识点:Mysql 索引优化实战(3)

知识点:Mysql 数据库索引优化实战(4)

索引原理知识回顾

索引的性能分析和优化

通过 EXPLAIN 来判断 SQL 的执行计划,发现慢 SQL 或者性能影响业务的 sql

explain [EXTENDED] SELECT...

查看执行计划会有如下信息:

id:1
select_type:simple
table:t
possible_keys:primary
key:primary
key_len:4
ref:const
rows:1
filtered:100.00
extra:using index

关于 key_len 长度计算公式:

varchar(10) 变长字段且允许 NULL:10_(Character Set:utf-8,gbk=2,latin1=1)+1(NULL)+2(变长字段)
varchar(10) 变长字段且不允许 NULL:10_(Character Set:utf-8,gbk=2,latin1=1)+2(变长字段)
char(10) 变长字段且允许 NULL:10_(Character Set:utf-8,gbk=2,latin1=1)+1(NULL)
char(10) 变长字段且不允许 NULL:10_(Character Set:utf-8,gbk=2,latin1=1)

默认 null,会占用字节,索引长度。 也就是说索引 key_len 长度过大,也会影响 SQL 性能。

4.1 索引提高 SQL 效率的方法

  • 利用索引加快查询速度
  • 行记录检索
  • 从索引记录中直接返回结果(联合索引)
min(), max()
order by
group by
distinct

如果列定义为 DEFAULT NULL 时,NULL 值也会有索引,存放在索引树的最前端部分。 案例 1:

CREATE TABLE `base_assets` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`ASSETS1` int(11) DEFAULT '0',
`ASSETS2` int(10) unsigned DEFAULT NULL,
`ASSETS5` int(10) unsigned NOT NULL DEFAULT '0',
`ASSETS3` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_STAMP,
`ASSETS4` varchar(200) NOT NULL DEFAULT, PRIMARY KEY (`ID`)
KEY 'idx_A1' (`ASSETS1`),
KEY `key_c2` (`ASSETS2`)
) ENGINE=InnoDB AUTO_INCREMENT=512976 DEFAULT CHARSET=utf8;

表说明:

  • 500 万行记录,ASSETS11、ASSETS12、ASSETS15 三个列值完全一样,但定义不一样:
  • ASSETS1 列定义为 NOT NULL DEFAULT 0,有索引
  • ASSETS2 列定义为 DEFAULT NULL,有索引
  • ASSETS5 列定义为 NOT NULL DEFAULT 0,无索引
# 查询
explain select ASSETS1 from base_assets where ASSETS1 = 100000 limit 1; # 对比 explain select ASSETS5 from base_assets where ASSETS5 = 100000 limit 1; # 统计类业务: explain select max(ASSETS2) from base_assets; # 求平均值,有索引时,扫描索引即可,无需全表扫描(避免回表) explain select avg(ASSETS1) from base_assets;

4.2 利用索引提高排序效率

# 查询
explain select ASSETS5 from base_assets where ASSETS5 > 100000 order by ASSETS5 limit 100; # 有索引,可以快速排序完成
explain select ASSETS5 from base_assets where ASSETS1 > 100000 order by ASSETS1 limit 100; # 读写的列改成c1 explain select ASSETS1 from base_assets where ASSETS1 > 100000 order by ASSETS1 limit 100;

结果可以再次表明不同的执行计划性能差距。(图略)

4.3 NOT NULL 和 DEFAULT NULL 的区别

desc select count(ASSETS1) from base_assets;

desc select count(ASSETS2) from base_assets;

desc select count(ASSETS1) from base_assets where ASSETS1 is null;

desc select count(ASSETS2) from base_assets where ASSETS2 is null;

4.4 利用 index merge - Using union

desc select * form base_assets where ASSETS1 = 2333 or ASSETS2 = 6666

案例 2:

# 测试索引写入效率

create bable base_assets_test (

id int unsigned not null auto_increment,
assets1 int not null default '0',
assets2 int not null default '0',
assets3 int not null default '0',
assets4 int not null default '0',
assets5 timestamp null,
assets6 varchar(200) not null default '',
primary key('id'),
KEY `idx_c2`(`assets2`),
KEY `idx_c3` (`assets3`)
); # 测试有无索引对比写入效率存储过程 delimiter $$$
create procedure 'insert_test'(in row_num int)
begin
declare i int default 1;
while i <= row_num do
insert into base_assets_test(id,assets1,assets2,assets3,assets4,assets5,assets6)
values(i,floor(rand()_row_num),floor(rand()_row_num),floor(rand()_row_num),
now(),repeat('wubx',floor(rand()*)20))); set i = i + 1;
end while;
end $$$

客户端调用:call insert_test (1 000 000);

插入初始化数据:

1 模式 耗时
innodb 无索引 110
innodb 只有主键索引 110
innodb 下全部索引 110
myisam 无任何索引 24
myisam 只有主键索引 27
myisam 全部索引 31

小结

  • 建议低选择性的列不加索引,如性别,姓名;
  • 选择性高的字段放在前面,常用的字段放在前面;
  • 需要经常排序的字段,可加到索引中,列顺序和最常用的排序一致;
  • 对较长的字符数据类型的字段建索引,优先考虑前缀索引,如 index(url(64))
  • 只创建需要的索引,避免冗余索引,如:index(a,b),index(a)

InnoDB 表主键、索引

  • Innodb 表每一个表都要显式设置主键;
  • 主键越短越好,最好是自增类型;如果不能使用自增,则应考虑构造使用单向递增型主键,禁止使用随机类型值用于主键;
  • 主键最好由一个字段构成,组合主键不允许超过 3 个字段。如果业务需求,则可以创建一个自增字段作为主键,再添加一个唯一索引;
  • 选择作为主键的列必须在插入后不再修改或者极少修改,否则需考虑使用自增列作为主键;
  • 如果一个业务上存在多个 (组) 唯一键,以查询最常用的唯一键作为主键。

over

知识点:Mysql 索引优化实战(3)的更多相关文章

  1. MySQL——索引优化实战

    上篇文章中介绍了索引的基本内容,这篇文章我们继续介绍索引优化实战.在介绍索引优化实战之前,首先要介绍两个与索引相关的重要概念,这两个概念对于索引优化至关重要. 本篇文章用于测试的user表结构: 索引 ...

  2. 知识点:Mysql 数据库索引优化实战(4)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ...

  3. MySQL索引优化看这篇文章就够了!

    阅读本文大概需要 5 分钟. 来源:cnblogs.com/songwenjie/p/9410009.html 本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引 ...

  4. 讲真,MySQL索引优化看这篇文章就够了

    本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL——索引基础 首先,我们将从索引基础开始介绍一下什么 ...

  5. MySQL高性能优化实战总结!

    1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...

  6. 收藏起来,史上最全的 MySQL 高性能优化实战总结!

    转自:https://mp.weixin.qq.com/s/sRsJzFO9dPtKhovJNWN3Dg 一.前言 MySQL 对于很多 Linux 从业者而言,是一个非常棘手的问题,多数情况都是因为 ...

  7. Linux记录-史上最全的MySQL高性能优化实战总结(转载)

       史上最全的MySQL高性能优化实战总结! 1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优 ...

  8. 史上最全的MySQL高性能优化实战总结!

    1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...

  9. 必须收藏的MySQL高性能优化实战总结!

    MySQL对于很多程序员来说,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是 ...

随机推荐

  1. 访问mysql出现Access denied for user 'root'@'的解决方法

    1.关闭mysql的服务 方法一:我的电脑右键-管理-服务和应用程序-服务,找到mysql,右键关闭 方法二:cmd进入命令提示符,service mysqld stop(这个是网上的方法,我试了一下 ...

  2. MongoDB的安装和使用

    Step1:下载和安装 下载地址:http://dl.mongodb.org/dl/win32/x86_64 安装:一直按照默认指示去安装或者选择自己喜欢的路径安装. Step2:配置环境变量 安装完 ...

  3. 我的第一篇博客:vue-cli配置项目

    注意:在安装vue-cli之前一定要确保安装了node和vue 安装配置node:下载node(https://nodejs.org/en/)然后一路无脑安装 查看安装是否成功:node –versi ...

  4. 海思hi3516 ive运动目标检测简单实现

    在做车牌识别项目,通过先对识别区域内进行目标识别,能降低CPU的占用率,在检测到有运动目标的时候,再做车牌识别. //图像差分 s32Ret = HI_MPI_IVE_Sub(&IveHand ...

  5. ECDSA host key for 192.168.0.101 has changed and you have requested strict checking.

    原文地址:http://blog.csdn.net/ausboyue/article/details/52775281 Linux SSH命令错误:ECDSA host key "ip地址& ...

  6. 对C语言指针的理解

    一个小程序引发对于C语言指针的思考: #include <bits/stdc++.h> using namespace std; void my_swap (int* a,int* b) ...

  7. PYTHON的前端部分

    CSS部分,CSS起到修饰HTML的作用比如颜色,字体,等等. css如何和HTML共同其作用,那么CSS有几种引入HTML的方式 那么当引入了CSS如何让css对应的使相应的HTML标签上起作用,就 ...

  8. 非常完善的两个微服务框架比较(SpringCloud与Dubbo)

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 虽然微服务架构没有公认的技术标准和规范或者草案,但 ...

  9. windows7 64位系统安装CPU版本TensorFlow(anaconda3.6)

    1>下载anaconda3.6,https://www.anaconda.com/download/,选择64位的anaconda3.6,安装时候,路径可以自定义,但是要选择把路径添加到环境变量 ...

  10. C++ 状态机接口

    最近的状态极差,甚至代码也写不下去了.给自己手臂上的两刀没有任何的作用,看来早已经是麻痹了. 一直想弄一个勉强能用的状态机,用于在各种涉及到状态转换的时候用到,然而脑子并不是太清醒. 先放在这里一个接 ...