思想
所有任务的响应时间上的性能优化,基本上都可以通过以下步骤完成:
将任务划分为多个子任务
性能剖析: 测量和分析时间花费在哪里
测量子任务所花费的时间
对结果进行统计和排序
将重要的任务排在前面
原因: 推断系统运行的方式,找出慢的原因
优化: 针对该原因进行改良
工具
Explain
OptimizerTrace
Profiling
示例数据和语句
Create Table: CREATE TABLE `record` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL COMMENT '用户',
`purse_type` int(8) NOT NULL DEFAULT '0' COMMENT '货币类型',
`order_id` varchar(32) NOT NULL DEFAULT '' COMMENT '订单id',
`order_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '操作类型',
`profit` int(11) NOT NULL DEFAULT '0' COMMENT '金额',
`source` varchar(32) NOT NULL DEFAULT '' COMMENT '业务来源',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态',
`excuse` varchar(32) NOT NULL DEFAULT '' COMMENT '描述',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_purse_type_order_id` (`purse_type`,`order_id`),
KEY `index_uid_purse_order_type_status_create` (`uid`,`purse_type`,`order_type`,`status`,`create_time`),
KEY `ix_create_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=7341596 DEFAULT CHARSET=utf8mb4
语句:select sum(profit) as total from record where uid=1800138860 AND purse_type=1 AND status in (10,20,100) AND source in (1016)
步骤
我们通过两个维度对查询进行分析:逻辑维度和微观维度,来定位性能原因
假设我们已经通过trace确认了就是数据库慢,记录要分析的数据库表结构和语句
找出慢查询语句:慢查询日志或者trace系统
分析慢查询日志的执行计划
通过explain语句的输出判断分析的执行计划是否符合预期
通过optimizer_trace语句分析执行计划
在逻辑维度上
我们按照执行计划将查询划分成多个子任务,构造连续子任务的语句,启动profiling,依次执行,记录时间,注意Buffer对执行时间的影响
作表:记录子任务和耗时以