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

先看一下表结构

评论表:

评论表的索引:

用户表:

用户表的索引:

查询语句如下:

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. Exchange无法发送邮件 未找到匹配的连接器来路由外部收件人解决办法

    使用命令行管理程序创建发送连接器 本示例创建发送连接器,用于集线器传输服务器 HubA 向 Internet 发送电子邮件.   复制 New-SendConnector -Name "In ...

  2. 解决MVC模型验证在IE 6 7下不起作用或者报错

    文件版本列出: Jquery版本1.7.1 jQuery Validation 版本1.9.0 (VS2012创建MVC项目自动生成的版本) 最好VS2012创建MVC项目自动生成的版本,而不是VS2 ...

  3. cuda编程学习4——Julia

    书上的例子编译会有错误,修改一下行即可. __device__ cuComplex(float a,float b):r(a),i(b){} /* ========================== ...

  4. 关于微信小程序图片失真的解决方案

    今天来说一说 关于微信小程序的图片失真问题的解决,微信小程序的image标签要设置其宽高,不然图片若宽高过大会撑开原始图片大小的区域:如下 但是宽高设置固定了会导致有些图片和规定显示图片大小的比例不一 ...

  5. Linux命令--su与sudo

    su(switch user)命令的作用:切换用户,一般是普通用户与root用户之间的切换.例:>su                #输入su命令Password:      #提示输入密码 ...

  6. 【转】PV3D的小练习~太阳系八大行星

    转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...

  7. 手机自动化测试:appium源码分析之bootstrap十五

    手机自动化测试:appium源码分析之bootstrap十五   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  8. 项目在App Store的展示信息

    一.首部1.图标作用:一个软件的logo.修改:每次提交新版本时可以修改.要求:1>1024*1024像素 2>72dpi.RGB.平展.不透明.没有圆角 3>高品质的JPEG或PN ...

  9. 使用Jersey实现图片服务器与应用服务器分离

         现在模拟一下Jersey从客户端发送图片到服务器.   1.Tomcat准备 (1)解压一个新的Tomcat作为图片服务器,然后修改端口号(有3处).                (2)然 ...

  10. 解决移动端click点击问题

    下载地址:https://github.com/ftlabs/fastclick 1,为什么移动端点击会有300ms的延迟呢? 从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 3 ...