業務邏輯如下:查詢某篇文章的評論列表,且列出評論人及被評論人的昵稱、頭像。
先看一下表結構
評論表:
評論表的索引:
用戶表:
用戶表的索引:
查詢語句如下:
SELECT t1.comment_id commentId, t1.content content, t1.create_date replyDate, t1.fk_user_id replyUserId, t1.avatar_url replyAvatarUrl, t1.nick_name replyNickName, t2.nick_name repliedNickName FROM ( SELECT a.comment_id, a.p_comment_id, a.content, a.create_date, a.fk_user_id, b.avatar_url, b.nick_name, a. STATUS FROM tb_cms_comment a, tb_cms_appuser b WHERE a.fk_user_id = b.user_id AND a. STATUS = 1 AND a.fk_content_id = 'F6D5ACB54EA94C1C8D5B2397AF7B546b' ) t1 LEFT JOIN ( SELECT a.comment_id, b.nick_name FROM tb_cms_comment a, tb_cms_appuser b WHERE a.fk_user_id = b.user_id AND a.fk_content_id = 'F6D5ACB54EA94C1C8D5B2397AF7B546b' ) t2 ON t1.p_comment_id = t2.comment_id ORDER BY STR_TO_DATE( t1.create_date, '%Y-%m-%d %H:%i:%s' ) DESC
理論上講執行評論表和用戶表的關聯查詢時,會用到在評論表上創建的索引idx_con_st_user和用戶表的idx_user_id索引,但用explain查看sql的執行計划時,用戶表的索引一直沒被使用上,糾結了一天,最后用mysql自帶的客戶端工具詳細查看sql的執行計划時才發現問題所在,所以各位如果出現類似情況可以通過以下步驟檢查一下:
1、兩表關聯使用的條件字段中字段的長度是否是一致的
2、兩表關聯使用的條件字段中字段的編碼是否是一致的
如果以上兩個條件未滿足,基本是用不上索引的,我的情況就是第二種情況引起的
a.fk_user_id = b.user_id ,fk_user_id 的編碼是utf8 而 user_id 的編碼方式是utf8mb4的,所以導致索引失效