高性能可扩展mysql(执行计划,索引分析优化改写,删除重复数据,区间统计,满查询日志)

来源:互联网 发布:mac os官方下载 编辑:程序博客网 时间:2024/06/02 04:14

需求:对评论进行分页展示(利用执行计划优化查询)

explain执行计划sql分析

  • select
  • update
  • insert
  • replace
  • delete
SELECT customer_id,title,content FROM `product_comment` HWERE audit_status = 1 AND product_id = 199726 LIMIT 0,5;

这里写图片描述
- 结果(检查是否正确执行索引)
- SQL如何使用索引
- 关联查询的执行顺序(mysql优化器根据索引的信息,自动的调整索引的顺序)
- 查询扫描的数据行数

ID列

这里写图片描述

查询一组分类下商品的标题

这里写图片描述

查询最小分类的ID对应最大商品ID的一个评论标题(3个select语句)

这里写图片描述

查询每个一级分类最大的商品ID对应评论的标题信息

这里写图片描述

SELECT_TYPE列

UNION RESUT时,ID值为null.
DERIVED 衍生表,用来表示包涵在FROM字句中的字查询。myslq递归的执行,并将结果放在临死表中,临时表就是派生表。

这里写图片描述
这里写图片描述

TABLE列,执行计划中的数据是由哪个表输出的。

这里写图片描述

PARTITIONS列,查询分区表

如果不按照分区键选择,就会显示全部的分区,因为是跨分区扫描
- 对于分区表,显示查询的分区ID
- 对于非分区表,显示为NULL

TYPE列,查询中使用的一个类型(mysql访问数据的方式)

这里写图片描述

Extra列(扩展列,包涵mysql如何执行查询的一些附加信息)

这里写图片描述
这里写图片描述

POSSIBLE_KEYS列

这里写图片描述

KEY列

这里写图片描述

KEY_LEN列

这里写图片描述

Ref列(当前表在利用key列中的索引进行查询时,所用到的列或者常量)

这里写图片描述

Rows列

这里写图片描述

Filtered列

这里写图片描述

执行计划的限制

这里写图片描述

优化评论分页查询(添加索引)

>使用情况:中间结果集差距很小的情况,或者数据量很小的情况

首先,我们可以考虑对where条件添加索引,就是audit_status 和 product_id添加一个联合索引
问题:audit_status 和 product_id哪个放在最左侧
根据索引设计规范,先计算一下这两列在表中的区分度
数据越接近1,区分度越高

这里写图片描述

这里写图片描述
缺点:越往后翻页,查询效率越来越差,时间也越来越长,尤其数据量很大

sql进一步优化:改写

数据库访问开销=索引IO+索引全部记录结果对应表数据的IO

数据库访问开销=索引IO+索引返回15条记录对应表数据的IO
IO节约很多
在任意位置翻页的消耗都是相同的
使用情况:中间结果集差距很大的情况,或者ORDER BY,WHERE有对应的覆盖索引

该SQL使用前提:comment_id是主键,而且有覆盖索引(product_id和audit_status联合索引)

这里写图片描述

需求:删除重复数据

这里写图片描述

这里写图片描述

测试查询数据

这里写图片描述

第二步CREATE TABLE bak_product_comment_161022 LIKE product_comment;INSERT INTO bak_product_comment_161022 SELECT * FROM product_comment;或者CREATE TABLE bak_product_comment_161022 AS SELECT  * FROM product_comment; 

删除
子查询:查询出所有商品中订单的重复评论的最小评论ID(要保留,最早的)
关联商品评论表,删除,相同订单,相同商品,大的评论ID

这里写图片描述

需求:分区间统计

根据订单主表(order_master)查询出所有用户消费总金额
关联登陆日志表和订单主表
CASE区间分隔
COUNT 用户量统计

这里写图片描述

这里写图片描述

验证

这里写图片描述

需求:捕获有问题的SQL-慢查日志

这里写图片描述

这里写图片描述

快速分析慢查询日志-mysqldumpslow

这里写图片描述

这里写图片描述

阅读全文
0 0