MySQL索引优化 笔记
少取字段,建立合理的索引
表优化:
1 定长与变长分离
如果都是定长 查询比较快 因为每一行的字节都是固定的 fixed
2 常用字段和不常用字段要分离
用户表 常用 放主表
个人介绍不常用 还比较长 可以单放一张表
3 在1对多 需要关联统计的字段上,分析字段的查询场景,查询频率低的字段单拆出来
添加冗余字段添加速度 和三范式相反
比如 论坛 每个栏目 今日发帖数量
正常要关联栏目表和帖子表 非常耗资源
可以在栏目表上添加数量字段 每次发帖+1
优化无非2个方式 : 空间换时间(现在内存大了 常用) 时间换空间
列选择原则:
1 字段优先级
整型>data,,time>enum,char>varchar>blob,text
整型: 定长 没有字符集 国家地区差异
如:tinyint
如果是字符串要考虑字符集和校对规则char(1)
order by排序 tinyint快
time 定长 考虑时区不方便 用时间戳
enum 内部也是整型 起约束左右 多了一个转换个过程
char 定长 要考虑字符集和校对规则
varchar 不定长 查的慢
blob,text 更慢 不发用null 排序只能在磁盘
char(1) 3字节
enum('男',‘女’) 内部转成数字 多了一个转换过程
tinyint 1字节 // 1 ,2 ,3
2 够用就行 不要慷慨
年龄 tinyint unsigned not null 255岁够了
int 浪费3个字节
varchar(300)比 varchar(10) 速度慢
3 尽量避免用null
null 不利于索引 在磁盘上占据空间更大 5.7后优化了 但查询仍不便
索引优化策略
btree索引 原理:
查数据 1 2 3 4 5 6 7 正常id=7 要查7次
4
2 6
1 3 5 7
先在索引数上跑,找到位置了 在指向表中行的信息
hash索引
只能在memory表(内存表 关机就没了)使用,查询速度O(1) 一下就找到
原理:
hash($id){
...
return address
}
通过函数算出个地址, 存磁盘 ,查的时候直接找地址
缺点:
1.hash(4) hash(94)地址一样,通过拉链算法 4和5不一定挨着 有很多空洞
2 无法对范围查询进行优化 查精准的虽然快 where id >=4 就慢了
3 无法利用前缀索引 btree中 通过索引查询helloworld hello也能, hash不行
4 排序也无法优化
5 必须回行 通过索引拿到数据位置,必须回到表中取数据
联合索引
用的更多 和顺序有关
index(a,b,c) 为例
可以看做3个木板过桥
】a b c 【
= 相当于 走完了 like 走一半
列:
where : a =3 走完了
a=3 & b= 4 ok
a=3 & b=4 & c= 5 ok
a=3 && b like 'hi%' c不能用
b=3 or c=4 没走a no
a=3 and b like '%word' a能 b不能 b前面不确定
索引的左前缀原则
索引除了提高查询速度 还能提高分组和排序的速度!
要分组先排序
explan 查看索引使用情况
聚簇索引和非聚簇索引
myisam引擎和innodb引擎 都是btree索引
myisam引擎: 非聚簇索引 数据是一个单独文件news.myd
索引是一个单独文件new.myi 是相互独立的
主索引和次索引都指向物理行(磁盘 位置) 相互没关系
innodb引擎: 数据在索引叶子下面
主索引文件上,直接存放该行数据,成为聚簇索引 次索引指向对主键的引用
1.主键索引 既存储索引值,又在叶子中存储行的数据
2.如果没有主键primary key,则会Unique key做主键
3.如果没有unique,则系统生成一个内部的rowid做主键
4.像innodb中,主键的索引结构中,既存储了主键值,又存储了行数据,这种结构称为聚簇索引
聚簇索引
优势:根据主键查询条目比较少时,不用回行(数据就在主键节点下)
劣势:如果碰到不规则数据插入时,造成频繁的页分裂
索引覆盖
在建立一个intex inm(id,name)索引的表中
查询select name form user where id = 2;
不需要回行,因为在索引中找到id=2 时,在旁边就能找到name值,不需要去数据库在找了,这种查询速度很快,这就是索引覆盖 Extra :using index
如果要查其他的字段则需要回行
如何设计理想的索引:
1 查询频繁的
2 区分度高的 如果100w用户 按性别男女区分各50w 区分度就低
3 长度小的 越大相当于目录越大
4 尽量能覆盖常用查询字段
列:
这种字段要建立索引 根据左前缀原则 重复太多
方法1:
倒序排列:
moc.udiab.www//:ptth 可以通过cn,com,net等建索引
方法2:
伪哈希技巧:
crc32是一种哈希算法,能把字符串算为32位整数
crc32(‘http://www.baidu,com’)用这个当索引
多列索引
多列索引的考虑因素:
列的查询频率
列的区分度
列的查询顺序
(要结合实际业务场景)
商城业务看 顾客一般先选大分类-小分类-品牌
index(cat_id,price)和dex(cat_id,brand_id,shop_price)
索引与排序
索引不光能提高查询速度 也能提高排序和分组的速度
1 覆盖索引 直接在索引上查询时 就是有顺序的using index
2 先取出数据 形成临时表做filesort(文件排序)
我们的争取目标--取出来的数据本身就是有序的
重复索引和冗余索引
重复索引:在同一个列或者顺序相同的几个列 建立了多个索引 可以重叠 别完全一样 不可以
冗余索引:是指2个索引所覆盖的列有重叠,但顺序不一样 比较常见 可以
根据文章标签查id 根据id查标签 建立2个索引
index arttag(artid,tag) index tagart(tag,artid)
修复表
索引碎片与维护 在长期的数据更改过程中,索引文件和数据文件,都将长生空洞,形成碎片
不可避免
nop操作(不产生对数据实际影响的操作)来修改表
修复表的数据及索引碎片,就会把所有的数据文件重新整理一遍,使之对齐,比较耗资源不能频繁修复
MySQL索引优化 笔记的更多相关文章
- mysql索引优化
mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间 ...
- Mysql 索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- 知识点:Mysql 索引优化实战(3)
知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...
- MySQL索引优化步骤总结
在项目使用mysql过程中,随着系统的运行,发现一些慢查询,在这里总结一下mysql索引优化步骤 1.开发过程优化 开发过程中对业务表中查询sql分析sql执行计划(尤其是业务流水表),主要是查看sq ...
- MySQL索引优化看这篇文章就够了!
阅读本文大概需要 5 分钟. 来源:cnblogs.com/songwenjie/p/9410009.html 本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引 ...
- mysql索引优化比普通查询速度快多少
mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...
- mySql索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- 【ZZ】MySQL 索引优化全攻略 | 菜鸟教程
MySQL 索引优化全攻略 http://www.runoob.com/w3cnote/mysql-index.html
- mysql数据库优化课程---17、mysql索引优化
mysql数据库优化课程---17.mysql索引优化 一.总结 一句话总结:一些字段可能会使索引失效,比如like,or等 1.check表监测的使用场景是什么? 视图 视图建立在两个表上, 删除了 ...
随机推荐
- 字面常量 kotlin(2)
字面常量数值常量字面值有以下几种:十进制: 123Long 类型用大写 L 标记: 123L十六进制: 0x0F二进制: 0b00001011注意: 不支持八进制Kotlin 同样支持浮点数的常规表示 ...
- JVM系列1:内存区域
1.JVM运行区域内存划分 2.各内存区域详细介绍 2.1 程序计数器 程序计数器是一块很小的内存区域,它作为前线程所执行的字节码的行号指示器,指向当前class文件的执行代码的行数.字节码解释器工作 ...
- Linux_ubuntu-命令系统管理
<1>查看当前日历:cal al命令用于查看当前日历,-y显示整年日历: <2>显示或设置时间:date 设置时间格式(需要管理员权限): date [MMDDhhmm[[CC ...
- 前端必须掌握的 nginx 技能(2)
概述 作为一个前端,我觉得必须要学会使用 nginx 干下面几件事: 代理静态资源 设置反向代理(添加https) 设置缓存 设置 log 部署 smtp 服务 设置 redis 缓存(选) 下面我按 ...
- java:反射(Hibernate的雏形)
* java.lang.Class类:Class类的实例表示正在运行的 Java 应用程序中的类和接口,没有构造方法. java反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法 ...
- C++类大小的计算
这里记录一下怎么计算类对象的大小. 大概总结下,类的大小需要考虑以下内容: 非静态成员变量大小 数据对齐到多少位 有无虚函数(即需不需要指向虚函数表的指针,如果考虑继承的情况,则还需要看继承了多少个指 ...
- mysql默认的存储引擎是什么?它们的区别有哪些?mysql中索引有哪些?
1.mysql默认引擎 mysql-5.1版本之前默认引擎是MyISAM,之后是innoDB 2.关系 MyISAM是非集聚引擎,支持全文索引;不支持事务;它是表级锁;会保存表的具体行数. innoD ...
- docker搭建环境的时候常用的命令有哪些
1.docker搭建环境的时候常用的命令有哪些 docker如果要删除镜像,现在停止container docker ps 查询正在运行的镜像docker stop +containerid停止后再删 ...
- DSP28335 eCAP 测频
F28335共有6组eCAP模块,每个eCAP不但具有捕获功能,而且还可用作PWM输出功能.F28335捕获模块的主要特征如下: 1. 150MHz系统时钟的情况下,32位时基的时间分辨率为6.67n ...
- Ubuntu16.04安装NVIDIA驱动、实现GPU加速
NVIDIA驱动前前后后装了好几遍,下面把个人的经验分享下,大家仅供参考. 老规矩,先引用师兄的(最详细)https://blog.csdn.net/sinat_23853639/article/de ...