脚本宝典收集整理的这篇文章主要介绍了MySQL优化,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
在海量数据中提升性能需要要看查询的字段是否有索引关系,加索引查询新能快
查字典的方式>通过目录快速定位到目标所在的页码
没用索引时:
使用索引
C:PRogramDataMySQLMySQL Server 8.0Datalibrary@002dmanager@002dSystem
.ibd索引和数据
.MYD数据
.MYI索引
InnoDB存储引擎:将索引和数据放在同个文件下
MyISAM存储引擎:将索引和数据放开两个文件存储
主键自带索引,通过主键查询 表中的记录,性能是非常好的
create index 索引名称 on 表名(列名)
create index idx_bid on Book(book_id)
在普通索引基础上,列的值时唯一的
create unique index idx_bname on book(book_name)
在一个索引中包含了多个列
create index idx_bauthor_bpublish on book(book_author,book_publish)
搜索引擎是用到.不会用MySql做全文索引,只有MyISAM支持
顺序表存储结构,链式存储结构,单向链表,双向链表
顺序栈,链栈,顺序队列,链式队列
定义串,动态串
二叉树,平衡二叉树,完全二叉树,红黑树,B树,B+树
满二叉树:都放满了
完全二叉树:排序树,先放左边
二叉排序树:左边的节点值小于右边的
平衡二叉树(AVL树):每棵树的左子树与右子树深度不超过一,每颗子树也是平衡二叉树,查找性能是最好的
转换:
右旋:
左旋:
双向旋转:
练习网站:https://www.cs.usfca.edu/~galles/Visualization/AlgorIThms.htML
红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:
性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:每个叶子节点(NIL)是黑色。
性质4:每个红色结点的两个子结点一定都是黑色。
性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
红黑树并不是一个完美平衡二叉查找树,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡。
一个节点可以存放多个数(节点的度)
如果节点度比较大,,那么存放的数据节点的个数就比较多,那么整棵树的深度就比较浅,整颗树的查询性能就很好
hash表
查找性能比B+树好,但不支持区间访问
连通图,有向图
MyISAM:非聚集索引
支持全文检索,支持表锁
InnoDB:聚集索引
普通索引
冗余放相同数据会造成空间浪费
推荐主键整型自增,不规律的主键会造成多次自旋影响性能
如果忘记了创建主键,MySQL也会创建临时主键
存储:一个索引存储了多个列
create index idx_bauthor_bpublish on book(book_author,book_publish)
最左前缀法则:
创建了联合索引以后,在使用SQL查询时,能否命中索引,就看查询条件是否遵循了
最左前缀法则.就不会全表扫描
联合索引是name和age,查询条件一定要包含name,遵循左前缀,就能走索引
例子:
create index idx_a_b_c on tb_tmp(a,b,c)
select * From tb_tmp where a=1 and b=2 and c=3 可以
select * from tb_tmp where a=1 and b=2 可以
select * from tb_tmp where b=2 and c=3 不可以
select * from tb_tmp where a=1 and c=3 只命中a的索引,再在所有a中查询
select * from tb_tmp where b=2 and c=3 and a=1 可以 sql会优化
即使我们在创建数据库是为表创建了索引,但我们在实际使用的sql语句却没有命中索引 造成了慢查询,会导致整个接口的性能非常差.
sql优化
防止慢查询,导致接口性能差.接口性能在1秒以内,甚至在200ms内
数据库的名称不规范,表的结构不规范,导致使用时出现了问题,对生产环境造成了影响
基础规范
存储引擎使用Innodb
表的字符集默认使用utf-8 通用,无乱码风险,汉字3字节,英文1字节
必要的时候使用utf8mb4 是utf8的超集,有存储4字节例如表情时使用
禁止使用存储过程,视图,触发器,Event
禁止在数据库中存储大文件
禁止在线上进行数据库压力测试
测试开发线上数据库环境必须隔离
命名规范
库名,表名,列名必须用小写,采用下划线分隔 tb_book
库名,表名,列名必须见名知意,疮毒不超过32字符
库备份必修一bak为前缀,以日期为后缀
从库必须以-s
为后缀
备库必须以-ss
为后缀
表的设计与规范
单实例表的个数在1024个以内
单表分表的个数在1024个以内
表必须有主键,推荐使用unsigned整数位主键
禁止使用外键
建议将大字段,访问频率低的字段拆封到单独的表存储
列设计规范
根据业务区分使用tinyint/int/Bigint,分别占用1/4/8字节
根据业务区分使用char(字段长度固定时)/vArchar
根据业务区分datetime/timetamp 前者占5个字节,后者占4哥字节,储存年用year,储存日期用date,储存时间用datetime
必须把字段定义成not null,并设置默认值
使用int unsigned存储ipv4
,不要用char(15)
使用VARchar(20)存储手机号,不要用整数
使用TINYINT代替ENUM,ENUM增加新值要进行DDL操作
索引规范
SQL规范
总结:
1.介绍
在SQL语句前添加EXplain关键字,查询当前SQL语句的执行性能
explain select * from employees where name like "customer100%"
2.MySQL内部优化器
explain select * from tb_book where id=1;
show warnings;
执行上面语句时,MySQL内部优化器会吧语句转化成下面的这条SQL,性能更好(直接从索引里拿数据
* select#1 */ select `1` AS `id`,`zhangsan` AS `name` from `db_mysql_pro`.`tb_book` where true
3.Explain中每个列各个细节
#关闭衍生表的合并优化,将显示衍生表
set session optimizer_switch=`derived_merge=off`
列名 | 含义 |
---|---|
id | @H_512_593@SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.|
select_tyPE | SELECT 查询的类型. |
table | 查询的是哪个表 |
partitions | 匹配的分区 |
type | join 类型 |
possible_keys | 此次查询中可能选用的索引 |
key | 此次查询中确切使用到的索引. |
key_len | 此次查询中使用到的索引的字节长度 |
ref | 哪个字段或常数与 key 一起被使用 |
rows | 显示此查询一共扫描了多少行. 这个是一个估计值. |
filtered | 表示此查询条件所过滤的数据的百分比 |
extra | 额外的信息 |