MYSQL索引失效(COLLATE不一致)
起因:
生产的工单系统的mysql 数据库CPU 100%。由于是周边系统使用虚机,数据量也很小。
show processlist;看到很多进程在sending data;
开始分析SQL
sql:如下(这已经截取慢的这一层,实际还要复杂很多,表明已其他字符代替):
执行直接40+秒
SELECT a.ASSIGNEE_, b.GROUP_ID_, COUNT(a.ASSIGNEE_) AS total
FROM fadfdsf a, fdadfd b
WHERE b.TASK_ID_ = a.ID_
AND b.GROUP_ID_ = '12'
AND a.ASSIGNEE_ IS NOT NULL
AND a.START_TIME_ >= date'2019-03-20'
AND a.PROC_DEF_ID_ = 'xxxxx
AND NOT EXISTS
(SELECT 1
FROM fdsafs
WHERE processInstanceId = a.PROC_INST_ID_
AND taskId = a.ID_
)
GROUP BY a.ASSIGNEE_, b.GROUP_ID_
开始发现start_time上没有索引,首先在start_time上建上索引,还是慢:
查看执行计划
+----+--------------------+------------------+-------+----------------------------------------+---------------------------+---------+-------------+--------+---------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+------------------+-------+----------------------------------------+---------------------------+---------+-------------+--------+---------------------------------------------------------------------+
| 1 | PRIMARY | a | range | PRIMARY,ind_act_start_time | ind_act_start_time | 7 | NULL | 2957 | Using index condition; Using where; Using temporary; Using filesort |
| 1 | PRIMARY | b | ref | ACT_IDX_HI_IDENT_LNK_TASK | ACT_IDX_HI_IDENT_LNK_TASK | 195 | ytbpm.a.ID_ | 1 | Using where |
| 2 | DEPENDENT SUBQUERY | tb_process_deals | ALL | index_process_id,ind_tb_process_taskId | NULL | NULL | NULL | 124215 | Range checked for each record (index map: 0x6) |
+----+--------------------+------------------+-------+----------------------------------------+---------------------------+---------+-------------+--------+---------------------------------------------------------------------+
发现没有走
ind_tb_process_taskId索引。
查找原因,发现两个表的collect不同:
由于上面的表是有流程应用自动生成,为utf8_bin:
而自己创建的表是 utf8_general_ci,解决办法
1.将 taskId字段改成ut8_bin:
alter table sdfsdfd CHANGE taskId taskId VARCHAR(45) CHARACTER SET utf8 COLLATE utf8_bin;
2.可以查询时候列修改输出:
SELECT k COLLATE utf8_bin AS k1
FROM t1
ORDER BY k1;
后查询不到0.1秒。
找了下MYSQL 官方文档: