剖析单条查询sql实战
1.构建表结构
create database yizhen_wqf_help;use yizhen_wqf_help;CREATE TABLE `image_info` (`PATIENT_IMAGE_PK` int(11) NOT NULL AUTO_INCREMENT ,`HOSPITAL_FK` int(11) DEFAULT NULL ,`PATIENT_FK` int(11) DEFAULT NULL ,`IMAGE_NO` varchar(20) DEFAULT NULL ,`CHECK_NO` varchar(20) DEFAULT NULL ,`MODALITY` varchar(20) DEFAULT NULL ,`IMAGE_SIZE` decimal(50,2) DEFAULT NULL ,`IMAGE_NUM` int(11) DEFAULT NULL ,`IMAGE_PATH_OUT` longtext ,`IMAGE_PATH_IN` longtext ,PRIMARY KEY (`PATIENT_IMAGE_PK`),KEY `idx_hos` (`HOSPITAL_FK`),KEY `idx_hos_checkno` (`HOSPITAL_FK`,`CHECK_NO`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;CREATE TABLE `check_info` (`CHECK_APPLY_PK` int(11) NOT NULL AUTO_INCREMENT ,`PATIENT_HOSPITAL_FK` int(11) DEFAULT NULL ,`DEPARTMENT_FK` int(11) DEFAULT NULL ,`IMAGE_NO` varchar(20) DEFAULT NULL ,`CHECK_NO` varchar(20) DEFAULT NULL ,`APPLY_HOSPITAL_FK` int(11) DEFAULT NULL ,`APPLY_HOSPITAL` varchar(100) DEFAULT NULL ,`APPLY_DEPARTMENT_FK` int(11) DEFAULT NULL ,`APPLY_DEPARTMENT` varchar(100) DEFAULT NULL ,`ADM_ID` varchar(20) DEFAULT NULL ,`ADM_ID_ISS` varchar(20) DEFAULT NULL ,`ENROL_TIME` datetime DEFAULT NULL ,`VIDEO_ROOM_FK` int(11) DEFAULT NULL ,`MEDICAL_STATUS` varchar(20) DEFAULT NULL ,`PATIENT_NAME` varchar(100) DEFAULT NULL,`SEX` varchar(10) DEFAULT NULL,`DOCTOR_NAME` varchar(64) DEFAULT NULL ,`VIDEO_ROOM_NAME` varchar(50) DEFAULT NULL,PRIMARY KEY (`CHECK_APPLY_PK`),KEY `idx_hos_checkno` (`APPLY_HOSPITAL_FK`,`CHECK_NO`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.导入历史数据
使用source命令分别导入两张表数据
3.大量查询制造慢日志以及系统压力
多次执行下面的慢SQL,并且监控服务器性能
select count(1) from check_info taleft join image_info tbon ta.apply_hospital_fk=tb.hospital_fk and ta.check_no=tb.check_nowhere ta.apply_hospital_fk=990042 limit 1;
执行top命令:

执行top -Hp 1224

监控到服务器的CPU增长比较明显,其他指标正常。
4.分析慢日志
使用第三方分析工具pt-query-digest,重点分析rank排名靠前的SQL
5.优化方案的选择
执行explain命令,发现没有使用索引,导致关联产生了笛卡尔积
执行show profile,发现数据主要发生在sending data阶段
执行show status,发现表产生了很大的顺序扫描,证明没有利用上索引
执行optimze_trace,跟踪具体的执行计划的生成


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

