MySQL联表查询的索引使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL联表查询的索引使用相关的知识,希望对你有一定的参考价值。
参考技术A 一共3张表 knowledge , knowledge_question , knowledge_answer ,数据在 6000~10000 之间。执行的语句:
执行时间约 10分钟 ,查看执行计划如下:
全部都是全表扫描,根据mysql联表查询的算法 Nested-Loop Join ,MySQL查询的结果集是3张表的笛卡尔积,所以效率特别低。
耗时变成 20毫秒
给Where条件建立索引,并不一定会使用。
比如:在表 knowledge 的字段 update 上建立索引 idx_time :
结果执行上来看,并没有使用索引 idx_time 。
如果where条件从 k.update_time>'2019-01-03 12:00:00' 修改为 k.update_time='2019-01-03 12:00:00' (从 > 变成 = )
则会使用索引 idx_time
在建立索引的时候,会遇到 Table Metadata Lock 的问题,可以先 show processlist ,找到占用表锁的连接,然后 kill 。
MYSQL数据库表排序规则不一致导致联表查询,索引不起作用问题
Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题
表更描述: 将mysql数据库中的worktask表添加ishaspic字段。
具体操作:(1)数据库worktask表新添是否有图片字段ishaspic;新添字段时,报错
[SQL] alter table WorkTask add ishaspic int(10) Null;
[Err] 1034 - Incorrect key file for table ‘WorkTask‘; try to repair it
解决方案:新建worktask表,添加ishaspic字段,将原worktask表中的数据插入新建表中.
(2)生产环境部署变更代码,应用启动后,一段时间后台报错
org.hibernate.exception.GenericJDBCException: Could not open connection
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
(3)监控数据库服务,发现查询sql突然变慢,数据库服务器CPU资源占用率超高。
(4)变更回退,错误仍然存在。
原来应用能正常运行,现在不能正常运行,监控数据库,发现sql查询执行时间突然变慢,单独执行sql,发现也很慢,到达百秒级。
问题定位:在新建worktask表时,改变了表的排序规则,以至于使和所联表的排序规则不一样,导致联表查询SQL语句,索引不起作用。
解决方案:(1)将联表查询SQL进行拆分;(2)调整数据表的排序规则,保证所联表数据表的排序规则一致。
*************************************************************************************
MySQL中的排序规则。在新建MySQL数据库或表的时候经常会选择字符集和排序规则。数据库用的字符集大家都知道是怎么回事,那排序规则是什么呢?
排序规则:是指对指定字符集下不同字符的比较规则。其特征有以下几点:
1、 两个不同的字符集不能有相同的排序规则
2、 两个字符集有一个默认的排序规则
3、 有一些常用的命名规则。如_ci结尾表示大小写不敏感(caseinsensitive),_cs表示大小写敏感(case sensitive),_bin表示二进制的比较(binary).
在MySQL数据库中,可以使用show collation来查看支持的各种排序呢规则,我用的是MySQL 5.6.12-log版本的数据库,支持219种排序规则。
以上是关于MySQL联表查询的索引使用的主要内容,如果未能解决你的问题,请参考以下文章