![]() |
1
4
用户数据表中ColumnX的数据类型和用途是什么?应该注意的是,任何文本数据类型(即不包括char、varchar)都会强制在磁盘上创建任何临时表。现在,由于您正在执行一个没有条件、分组或排序的直接联接,所以它可能不需要任何临时表,除了聚合最终结果。 我认为如果您向我们展示您的索引是如何创建的,这也将非常有帮助。需要记住的一点是,尽管innodb将表的主键连接到每个索引,但myisam不会。这意味着如果索引列 名称 用like搜索它,但仍然想得到 身份证件 页组;那么查询仍然需要访问表以获取 身份证件 而不是从索引中检索它。 如果我理解你的意见 密码器 正确的做法是获取每个用户的页面组的名称。查询优化器希望为联接使用索引,但对于每个结果,它还需要访问表以检索页面组名。如果您的数据类型为 名称 不大于中等varchar,即没有文本,还可以创建一个索引(id,name),使查询能够直接从索引中提取名称。 作为最后的尝试,您指出如果MediumText不在页表中,整个查询可能更快。
希望这能使您更快地加入,因为页面中的任何列都不会占用太多空间。然后,当需要显示某个页面时,可以在pageid列上与page data表联接,以获取显示特定页面所需的数据。 |
![]() |
2
2
了解mysql对查询的作用的简单方法是让它向您解释查询。运行此命令并查看输出:
MySQL将告诉您它处理查询的顺序以及使用的索引。创建索引并不意味着MySQL实际使用索引。 也见 Optimizing queries with EXPLAIN 编辑 你的解释输出看起来不错。它对userdata表进行全表扫描,但这是正常的,因为您希望返回其中的所有行。优化这一点的最佳方法是重新考虑应用程序。您真的需要返回所有372K行吗? |
![]() |
3
2
我假设用户数据表非常大,不适合内存。MySQL必须从硬盘读取整个表,即使它只需要两个小列。 您可以通过定义一个包含查询所需全部内容的索引来消除扫描整个表的需要。这样,索引就不是一种方便搜索主表的方法,而是表本身的简写版本。MySQL只需要从磁盘读取速记表。 索引可能如下所示:
这必须是非聚集的,否则它将成为大桌子的一部分,从而破坏它的目的。见 this page 关于mysql如何决定集群的索引的想法。最简单的方法似乎是确保pageid上有一个主键,它将被集群化,因此辅助column1+pageid索引将是非集群化的。 |
![]() |
4
1
一个可能的问题是,MySQL每个查询只使用一个索引,并且可能没有一个包含这些列的索引——或者MySQL的查询优化器没有选择它。什么?
|
![]() |
5
1
我将从分解查询开始,找出是否有一个慢的部分和一个快的部分,或者两者都慢(抱歉,我不喜欢使用语法,所以我将继续使用):
这给了你什么?把这些和
|
![]() |
6
1
看起来您正在对上的所有行执行联接
|
![]() |
user164863 · 我可以让这个mySQL查询更快吗? 7 年前 |
![]() |
Ronak Patel · mysql-无适当索引的长时间运行查询 7 年前 |
![]() |
Mohd Abdul Mujib · 检查上次查询中是否使用了缓冲区 7 年前 |
![]() |
Ronbear · 更改视图定义可以改进/降低两种不同的查询 7 年前 |
![]() |
Camilo · SQL-如何对15行的组求和并找到最大和 7 年前 |
![]() |
curiousgeorge · 在具有单独更新列的重复密钥更新批上插入 7 年前 |
![]() |
Oblomingo · 如何优化依赖于执行时间的T-SQL查询? 7 年前 |