ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 慢速SQL查询的特征

2019-07-21 19:13:38  阅读:167  来源: 互联网

标签:mysql database sql query-performance


最近在面试中被问到为什么对MySQL数据库的SELECT查询会非常缓慢并提出以下内容:

>在选择上执行多个JOIN
>关键过滤器字段中缺少索引(索引?)

还问了解决问题的方法,我说:

>如果查询非常重要,请对您的数据进行非规范化(我知道
这会导致数据重复,但还有另一种方法可以避免
JOIN的?)
>将索引添加到过滤列.

是否存在SQL查询效率低下的其他特征?请注意,我纯粹在寻找有关如何加速查询的提示,因此假设数据库服务器是完美的:-)

解决方法:

查询可能很慢的原因有几个.无论如何,要真正了解查询规划器正在做什么,您应该对它进行解释.大多数DBMS上的explain命令将告诉您查询计划程序将使用哪些索引,可以获得多少行数据,以及在开始获取结果之前需要处理多少行数据.

现在,为了给出查询可能运行缓慢的一些具体原因,您对索引是正确的.缺少索引将导致对查询中的表进行顺序扫描,如果这些表很大,可能会使事情变慢.在您正在加入或在where子句中使用的列上创建索引肯定有帮助.但有时候,查询规划器做得很差,你需要帮助它使用’force’命令来指示它应该使用哪个索引.

加入会减慢事情的速度,这是一种误解.单级连接通常很好.例如,您正在从表A中选择数据,并且您将B连接到A,将C连接到A.表B和C的连接是一个级别连接.多级联接需要更多时间来处理.这就是为什么在数据仓库和数据集市中,人们喜欢使用星型方案;这是一个包含度量的单个大表,一个事实表,该查询正在进行,还有其他表与描述性数据,维度表,它们加入了它.星型模式避免多级联接,因此可以快速执行报告查询.

然而,对你的桌子进行非规范化是很诱人的,我强烈建议不要这样做.当你开始对数据库进行非规范化时,如果你存储的数据量越来越大,那么你将会遇到一些严重的问题.同样,维护非规范化表格需要您的工程师对模式有一个非常好的工作知识,这使得技术债务变得更加困难.当然这是一个短期的收获,但长期的痛苦意味着你必须有一个非常好的理由想要这样做.做一些需要扩展的多年项目,你会真正看到非规范化的痛苦.

现在,根据您的需求,通常需要使用生产数据库中的数据构建和更新分离报告数据库,数据集市或数据仓库.这使您可以更自由地设计真正支持您要运行的报告查询的模式,并阻止您攻击生产数据库.

如果缺少资源,则单独数据库的一个不错的替代方法是临时表.临时表是在数据库连接/会话的生命周期中存在的表.其他连接/会话无法查看或访问它,隔离质量,您可以使用它们来存储和索引要在更大更复杂的查询中使用的数据.如果您通过控制台与数据库交互,则非常简单易用.如果您以编程方式使用其中一个并拥有连接池,我认为您可能必须在完成后删除该表;不能记得,但清理从来都不是坏事.

查询速度慢的一个明显原因是您正在选择大量数据.如果您尝试交叉连接多个表,每个表都有几亿行字符(1000)字段,您的DBMS可能会开始挖掘虚拟内存以执行连接.即使使用索引,也可能导致交换磁盘,一旦开始发生,欢迎来到slowville.

选择一个子选择(从f中选择a,b,(从e中选择c,d来自e,其中e.id = a)或使用where子句中的一个也可能非常慢,因为该subselect实际上是一个为每个子句执行的查询一行数据.在连接中使用子选择不会受到该问题的影响,但是,您实际上是在没有索引的情况下加入临时表,并且根据您使用该子选择检索的数据量,这可能会减慢速度.

如果您的设置非常大,in命令也可能会有问题.同样,大型集合基本上是一个没有索引的大型临时表,因此每次检查特定值是否在您的集合中时,您都在执行顺序扫描.

这些是我现在能想到的最突出的原因.还有其他但我认为这将超出堆栈溢出响应的范围;-)

标签:mysql,database,sql,query-performance
来源: https://codeday.me/bug/20190721/1494736.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有