提交mysql

This commit is contained in:
qiurunze123 2019-01-13 22:11:39 +08:00
parent 2ecb43d409
commit 8e92b288e8
2 changed files with 114 additions and 4 deletions

View File

@ -89,10 +89,10 @@
-------------------------------------------------|
#### [mysql数据库优化及架构学习](/docs/mysql.md)
##### [mysql数据库设计规范](/docs/mysql.md)
##### [mysql数据库设计实例](/docs/mysql.md)
##### [mysql数据库执行计划分析](/docs/mysql.md)
##### [mysql数据库备份和恢复](/docs/mysql.md)
##### [mysql数据库架构变迁](/docs/mysql.md)
##### [mysql数据库设计实例](/docs/mysql-1.md)
##### [mysql数据库执行计划分析](/docs/mysql-2.md)
##### [mysql数据库备份和恢复](/docs/mysql-3.md)
##### [mysql数据库架构变迁](/docs/mysql-4.md)
--------------------------------------------------|
#### [netty专题(已更新 by liuxiangyu)](/docs/netty.md)
#### [linux专题](/docs/linux.md)

110
docs/mysql-2.md Normal file
View File

@ -0,0 +1,110 @@
### mysql数据库设计与优化与架构 模拟场景(京东商城)
任何优化多需要场景,本次所有的场景为京东商城的数据库设计模拟!
有问题或者宝贵意见联系我的QQ,非常希望你的加入!
##简介:
设计:
1.常见业务处理
2.执行计划分析
3.如何优化分页查询示例
4.如何删除重复数据示例
5.如何进行分区间数据统计显示
6.捕获有问题的sql慢查日志
**执行计划能够告诉我们什么**
1.sql如何使用索引
2.链接查询的执行顺序
3.查询扫描数据行数
**执行计划内容**
![整体流程](https://raw.githubusercontent.com/qiurunze123/imageall/master/mysql1.png)
ID列数据为一组数字表示执行select语句的顺序
id值相同的时候执行顺数由上至下
id值越大优先级越高越先被执行
ID列中的如果数据为一组数字表示执行SELECT语句的顺序如果为NULL则说明这一行数据是由另外两个SQL语句进行 UNION操作后产生的结果集
SELECT_TYPE |_ SIMPLE不包含子查询或者是UNION操作的查询
|_ PRIMARY 查询中如果包含任何子查询,那么最外层的查询则被标记为 PRIMARY
|_ SUBQUERY select 列表中的子查询
|_ DEPENDENT 依赖外部结果的子查询
|_ SUBQUERY 依赖外部结果的子查询
|_ UNION Union操作的第二个或是之后的查询的值为union
|_ DEPENDENT UNION 当UNION作为子查询时第二或是第二个后的查询的select_type值
|_ UNION RESULT UNION产生的结果集
|_ DERIVED 出现在FROM子句中的子查询
TABLE |_ 所在表的名称,如果表取了别名,则显示的是别名
|_ <union M,N> 由ID为M,N查询union产生的结果集
|_ <derived N>/<subquery N> 由ID为N的查询产生的结果
PARTITIONS 分区表
查询匹配的记录来自哪一个分区
对于分区表显示查询的分区ID
对于非分区表显示为NULL
TYPE列
|_ system 这是const联接类型的一个特例当查询的表只有一行时使用
|_ const 表中有且只有一个匹配的行时使用,如对主键或是唯一索引的查询,这是效率最高的联接方式
|_ eq_ref 唯一索引或主键索引查询,对应每个索引键,表中只有一条记录与之匹配
|_ ref 非唯一索引查找,返回匹配某个单独值的所有行
|_ ref_or_null 类似于ref类型的查询但是附加了对NULL值列的查询
|_ index_merge 该联接类型表示使用了索引合并优化方法
|_ range 索引范围扫描常见于between、>、<这样的查询条件
|_ index FULL index Scan 全索引扫描同ALL的区别是遍历的是索引树
|_ ALL FULL TABLE Scan 全表扫描,这是效率最差的联接方式
Extra列
|_ Distinct 优化distinct操作在找到第一个匹配的元素后即停止查找
|_ Not exists 使用not exists来优化查询
|_ Using filesort 使用额外操作进行排序通常会出现在order by或group by查询中
|_ Using index 使用了覆盖索引进行查询
|_ Using temporary MySQL需要使用临时表来处理查询常见于排序子查询和分组查询
|_ Using where 需要在MySQL服务器层使用WHERE条件来过滤数据
|_ select tables optimized away 直接通过索引来获得数据,不用访问表,这种情况通常效率是最高的
POSSIBLE_KEYS列
|_ 指出MySQL能使用哪些索引来优化查询
|_ 查询列所涉及到的列上的索引都会被列出,但不一定会被使用
KEY列
|_查询优化器优化查询实际所使用的索引
|_如果表中没有可用的索引则显示为NULL
|_如果查询使用了覆盖索引则该索引仅出现在Key列中
KEY_LEN列
|_ 显示MySQL索引所使用的字节数在联合索引中如果有3列假如3列字段总长度为100个字节
Key_len显示的可能会小于100字节比如30字节
这就说明在查询过程中没有使用到联合索引的所有列只是利用到了前面的一列或2列
|_ 表示索引字段的最大可能长度
|_ Key_len的长度由字段定义计算而来并非数据的实际长度
Ref列
|_ 表示当前表在利用Key列记录中的索引进行查询时所用到的列或常量
|_
|_
rows列
|_ 表示MySQL通过索引的统计信息估算出来的所需读取的行数关联查询时显示的是每次嵌套查询时所需要的行数
|_ Rows值的大小是个统计抽样结果并不十分准确
Filtered列
|_ 表示返回结果的行数占需读取行数的百分比
|_ Filtered列的值越大越好值越大表明实际读取的行数与所需要返回的行数越接近
|_ Filtered列的值依赖统计信息所以同样也不是十分准确只是一个参考值
执行计划的限制
|_ 无法展示存储过程触发器UDF对查询的影响
|_ 无法使用EXPLAIN对存储过程进行分析
|_ 早期版本的MySQL只支持对SELECT语句进行分析
----------------------------------------------------
如何删除重复数据
删除评论表中的对同一个商品的重复评论,只保留最早的一条