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 官方文档:

MYSQL索引失效(COLLATE不一致)