剖析单条查询sql实战

1.构建表结构

  1. create database yizhen_wqf_help;
  2. use yizhen_wqf_help;
  3. CREATE TABLE `image_info` (
  4. `PATIENT_IMAGE_PK` int(11) NOT NULL AUTO_INCREMENT ,
  5. `HOSPITAL_FK` int(11) DEFAULT NULL ,
  6. `PATIENT_FK` int(11) DEFAULT NULL ,
  7. `IMAGE_NO` varchar(20) DEFAULT NULL ,
  8. `CHECK_NO` varchar(20) DEFAULT NULL ,
  9. `MODALITY` varchar(20) DEFAULT NULL ,
  10. `IMAGE_SIZE` decimal(50,2) DEFAULT NULL ,
  11. `IMAGE_NUM` int(11) DEFAULT NULL ,
  12. `IMAGE_PATH_OUT` longtext ,
  13. `IMAGE_PATH_IN` longtext ,
  14. PRIMARY KEY (`PATIENT_IMAGE_PK`),
  15. KEY `idx_hos` (`HOSPITAL_FK`),
  16. KEY `idx_hos_checkno` (`HOSPITAL_FK`,`CHECK_NO`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
  18. CREATE TABLE `check_info` (
  19. `CHECK_APPLY_PK` int(11) NOT NULL AUTO_INCREMENT ,
  20. `PATIENT_HOSPITAL_FK` int(11) DEFAULT NULL ,
  21. `DEPARTMENT_FK` int(11) DEFAULT NULL ,
  22. `IMAGE_NO` varchar(20) DEFAULT NULL ,
  23. `CHECK_NO` varchar(20) DEFAULT NULL ,
  24. `APPLY_HOSPITAL_FK` int(11) DEFAULT NULL ,
  25. `APPLY_HOSPITAL` varchar(100) DEFAULT NULL ,
  26. `APPLY_DEPARTMENT_FK` int(11) DEFAULT NULL ,
  27. `APPLY_DEPARTMENT` varchar(100) DEFAULT NULL ,
  28. `ADM_ID` varchar(20) DEFAULT NULL ,
  29. `ADM_ID_ISS` varchar(20) DEFAULT NULL ,
  30. `ENROL_TIME` datetime DEFAULT NULL ,
  31. `VIDEO_ROOM_FK` int(11) DEFAULT NULL ,
  32. `MEDICAL_STATUS` varchar(20) DEFAULT NULL ,
  33. `PATIENT_NAME` varchar(100) DEFAULT NULL,
  34. `SEX` varchar(10) DEFAULT NULL,
  35. `DOCTOR_NAME` varchar(64) DEFAULT NULL ,
  36. `VIDEO_ROOM_NAME` varchar(50) DEFAULT NULL,
  37. PRIMARY KEY (`CHECK_APPLY_PK`),
  38. KEY `idx_hos_checkno` (`APPLY_HOSPITAL_FK`,`CHECK_NO`)
  39. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.导入历史数据

使用source命令分别导入两张表数据

3.大量查询制造慢日志以及系统压力

多次执行下面的慢SQL,并且监控服务器性能

  1. select count(1) from check_info ta
  2. left join image_info tb
  3. on ta.apply_hospital_fk=tb.hospital_fk and ta.check_no=tb.check_no
  4. where ta.apply_hospital_fk=990042 limit 1;

执行top命令:

3.剖析单条查询sql实战 - 图1

执行top -Hp 1224

3.剖析单条查询sql实战 - 图2

监控到服务器的CPU增长比较明显,其他指标正常。

4.分析慢日志

使用第三方分析工具pt-query-digest,重点分析rank排名靠前的SQL
3.剖析单条查询sql实战 - 图3

5.优化方案的选择

执行explain命令,发现没有使用索引,导致关联产生了笛卡尔积
3.剖析单条查询sql实战 - 图4

执行show profile,发现数据主要发生在sending data阶段
3.剖析单条查询sql实战 - 图5

执行show status,发现表产生了很大的顺序扫描,证明没有利用上索引
3.剖析单条查询sql实战 - 图6

执行optimze_trace,跟踪具体的执行计划的生成

3.剖析单条查询sql实战 - 图7

3.剖析单条查询sql实战 - 图8

6.优化

为表image_info增加hospital_info和check_no的复合索引,然后跟主表check_info进行关联查询

3.剖析单条查询sql实战 - 图9