有人可以推荐一个关于 MySQL 索引的好教程,特别是在连接期间在 order by 子句中使用时? [关闭]

Posted

技术标签:

【中文标题】有人可以推荐一个关于 MySQL 索引的好教程,特别是在连接期间在 order by 子句中使用时? [关闭]【英文标题】:Can someone recommend a good tutorial on MySQL indexes, specifically when used in an order by clause during a join? [closed] 【发布时间】:2011-02-04 13:39:49 【问题描述】:

我可以尝试发布并解释我正在尝试运行的确切查询,但我会遵循古老的格言:“给一个人一条鱼,他会吃一天,教一个人鱼,他会吃一辈子。” SQL 优化似乎是非常特定于查询的,即使您可以为我解决这个特定查询,我将来也将不得不编写更多查询,并且我希望了解索引的工作原理一般。

不过,这里是对我当前问题的快速描述。我有一个连接三个表并在 0.2 秒内运行的查询。惊人的。我添加了一个“order by”子句,它在 4 分 30 秒内运行。糟透了。我对一张表进行了非规范化,因此少了一个连接,到处添加索引,现在查询运行在...... 20 分钟内。我勒个去?最后,我根本不使用连接,而是使用“where id in (...) order by”的子查询,现在它在 1.5 秒内运行。相当体面。以上帝的名义发生了什么?我觉得如果我真的了解索引在做什么,我可以编写一些非常好的 SQL。

有人知道一些好的教程吗?谢谢!

【问题讨论】:

嗯,你可能想看看查询计划,看看它在做什么。 是否为表定义了主键?了解有关您的表结构的更多信息将有助于我们为您提供帮助。 听起来您正在对没有索引的列进行排序。归结为最简单的形式,如果您要对列执行 WHERE、对列执行 ORDER BY、对列执行 JOIN 或任何其他涉及比较的操作,它应该有一个索引。 能否请您发布一份耗时 0.2 秒的原始查询的副本 再一次,如果您可以发布您的原始查询,我会比泛型更好地解释我所看到的。然后,除了其他人提供的指导之外,您还可以应用所有未来的查询 【参考方案1】:

我会推荐我最近读的两本书:

    High Performance mysql Refactoring SQL Applications

【讨论】:

【参考方案2】:

不是一个非常引人入胜的答案,但我发现官方文档提供了很好的背景:

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

您可以尝试一些事情(假设您已经使用EXPLAIN 分析了优化器路径):

尝试使用USE INDEX (<your index name here>) 运行查询,看看是否 你的索引使用实际上会 提供您期望的性能。 确保列的顺序 在任何综合指数中反映 您期望使用该索引的方式 (对不起,如果这有点含糊,但是 MySql 索引的使用可能有点古怪 有时)。

【讨论】:

以上是关于有人可以推荐一个关于 MySQL 索引的好教程,特别是在连接期间在 order by 子句中使用时? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

需要关于部署 ad-hoc 的好教程

如何将 sql union 转换为 linq

我在哪里可以找到关于 XSLT 文件的好教程? [关闭]

关于mysql建立索引 复合索引 索引类型

不会吧不会吧,难道还有人不了解MySQL索引底层原理?

我在哪里可以找到关于 REST 核心概念的好文档?