业务逻辑如下:查询某篇文章的评论列表,且列出评论人及被评论人的昵称、头像。

先看一下表结构

评论表:

评论表的索引:

用户表:

用户表的索引:

查询语句如下:

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的,所以导致索引失效

mysql 关联查询 索引不起作用原因记录的更多相关文章

  1. Mysql中 查询慢的 Sql语句的记录查找

    Mysql中 查询慢的 Sql语句的记录查找 慢查询日志 slow_query_log,是用来记录查询比较慢的sql语句,通过查询日志来查找哪条sql语句比较慢,这样可以对比较慢的sql可以进行优化. ...

  2. MySQL如何查询某个字段长度最大的记录

    转: MySQL如何查询某个字段长度最大的记录 2017年06月24日 13:12:15 翔云123456 阅读数 18348   版权声明:本文为翔云原创文章,未经博主允许不得转载. https:/ ...

  3. MySQL关联查询总结

    MySQL中经常使用关联查询,有机会总结下: 1 left join(左联查询): 返回包括左表中的所有记录和右表中联接字段相等的记录 例:select * from a left join b on ...

  4. mysql关联查询和联合查询

    一.内联方式 1.传统关联查询 "select * from students,transcript where students.sid=transcript.sid and transc ...

  5. MySQL☞关联查询

    关联查询:所需要的数据来源于多张表,通过表的连接查询(关联查询)来查询多张表中的数据 格式: select 别名1 . */列名 , 别名2 . */列名 from 表名1  别名1 , 表名2  别 ...

  6. Mysql中查询索引和创建索引

    查询索引   show index from table_name 1.添加PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( ` ...

  7. MySQL如何查询两个日期之间的记录

    baidu出来的结果多是下面答案:<quote> MySQL中,如何查询两个日期之间的记录,日期所在字段的类型为datetime(0000-00-00 00:00:00) 解决方案: 直接 ...

  8. mysql随机查询符合条件的几条记录

    随机查询,方法可以有很多种.比如,查询出所有记录,然后随机从列表中取n条记录.使用程序便可实现.可是程序实现必须查询出所有符合条件的记录(至少是所有符合条件的记录id),然后再随机取出n个id,查询数 ...

  9. mysql 关联查询技巧

    废话不多说,直接进入正题 #数据准备 班级表class: CREATE TABLE `class` ( `class_no` ) unsigned zerofill NOT NULL AUTO_INC ...

随机推荐

  1. git remote log error

    使用git pull的时候收到以下信息: error: there are still refs under 'refs/remotes/origin/xxxx'From 10.1.25.57:yyy ...

  2. Internal Server Error with LAMP

    文章出自:http://blog.csdn.net/lipei1220/article/details/8186406 我的问题:  500  添加 .htaccess 后刷新网页就出现错误. 原因为 ...

  3. PHP数据访问批量删除(10261101)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. HTML里为什么不能在<p>标签中嵌套<div>标签

    学习过HTML语言的人都应该知道,在HTML里,有分块级元素和内联元素:例如我们常用到的div,o,ul,dl,table,h1...h6等,这些都是块级元素:而像a,b,i,em,img,span等 ...

  5. JS清除DIV的选中状态

    var clearSlct = "getSelection" in window ? function () { window.getSelection().removeAllRa ...

  6. web works importScripts

    html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  7. pip --upgrade批量更新过期的python库

    pip --upgrade批量更新过期的python库 python pip 转载请标明出处:marsggbo网易博客http://blog.163.com/hexin_mars_blog/blog/ ...

  8. 维护Study

    ##老师发了一个study来让我们纠错维护,整个软件是日程管理系统,分为欢迎界面,登录 注册界面,提醒界面添加日程界面,还有个人中心等.一些主要代码老师让我们把缺失部分去维护.首先我们读一下主要代码# ...

  9. PMP和PRINCE2应该选择哪个?光环国际项目管理认证

    对于项目管理课程的选择,我们不能盲目地做选择,一定要从自身实际出发.从来都没有更好的课程,只有更合适自己的课程. 那么,如何选择合适自己的项目管理课程呢? 让我们从PMP与PRINCE2之间的差异开始 ...

  10. 抽象工厂模式(Abstract Factory)

    (二)抽象工厂模式(Abstract Factory) 1.抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式是 ...