当前位置: 首页 > 知识库问答 >
问题:

Mysql优化:有没有办法让它更快?

贺功
2023-03-14

更新:

谢谢所有的帮助。我将总结一下答案。

从@Jayde开始,他的回答成功地将结果减少到0.09秒,并且与限制中的数字成线性关系。

选择*from(选择table1.id作为table1\u id,从table1中选择table1.id

在@Rick James中,他提到这可能是表2的问题。因为我的表2只有几列,所以我可以省略它,自己进行连接,即使是在客户端!

所以我去掉了表2,它只有0.02s!

选择表1<代码>id作为表1\u id来自表1左侧连接表3表1上<代码>表3\u id=表3<代码>id其中表1<代码>id

最后,我发现,如果我把table2从内连接改为左连接,那么所有的痛苦都消失了,它是0.03秒!

选择table1。idastable1_idfromtable1table2table2_id=table2。code>table3ontable1table3_id=table3id其中table1id

再次感谢您的帮助!

==============================

注意:我运行在内存有限的嵌入式服务器上(大约1G,足够放入所有数据,实际上是200000个数据),并使用SD卡作为存储

选择table1.id从表1其中id

(0.01秒)

##################################################################################################################################################################################.id

(0.40秒)

##################################################################################################################################################################################.id

(0.01秒)

选择表1<代码>id作为表1\u id来自表1内部连接表2表1上<代码>表2\u id=表2<代码>id左连接表3表1上<代码>表3\u id=表3<代码>id其中表1<代码>id

(2.31秒)

选择表1<代码>id作为表1\u id来自表1内部连接表2表1上<代码>表2\u id=表2<代码>id左连接表3表1上<代码>表3\u id=表3<代码>id其中表1<代码>id

(0.03s)

正如评论所暗示的,我使用了解释,但我真的不明白解释说了什么。请帮我查一下。以下是最长的2.31秒。

+----+-------------+----------------------+--------+-------------------------------------------------------------------+---------------------------------------+---------+---------------------------------------------+-------+----------------------------------------------+
| id | select_type | table                | type   | possible_keys                                                     | key                                   | key_len | ref                                         | rows  | Extra                                        |
+----+-------------+----------------------+--------+-------------------------------------------------------------------+---------------------------------------+---------+---------------------------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | table2               | index  | PRIMARY,table2_id_index                                           | table1_id_index                       | 4       | NULL                                        |     1 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | table1               | ref    | PRIMARY,table1_table2_id_foreign,table1_id_index                  | table1_table2_id_foreign              | 4       | videocap.table2.id                          | 27222 | Using where                                  |
|  1 | SIMPLE      | table3               | eq_ref | PRIMARY                                                           | PRIMARY                               | 4       | videocap.table1.table3_id                   |     1 | Using index                                  |
+----+-------------+----------------------+--------+-------------------------------------------------------------------+---------------------------------------+---------+---------------------------------------------+-------+----------------------------------------------+

desc表的结果

表1:

+-------------------------+------------------+------+-----+---------------------+----------------+
| Field                   | Type             | Null | Key | Default             | Extra          |
+-------------------------+------------------+------+-----+---------------------+----------------+
| id                      | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| table2_id      | int(10) unsigned | NO   | MUL | NULL                |                |
| table3_id | int(10) unsigned | NO   | MUL | 0                   |                |
| created_at              | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at              | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
+-------------------------+------------------+------+-----+---------------------+----------------+

表2:

+-----------------+------------------+------+-----+---------------------+----------------+
| Field           | Type             | Null | Key | Default             | Extra          |
+-----------------+------------------+------+-----+---------------------+----------------+
| id              | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| created_at      | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at      | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
+-----------------+------------------+------+-----+---------------------+----------------+

表3:

+---------------------------+------------------+------+-----+---------------------+----------------+
| Field                     | Type             | Null | Key | Default             | Extra          |
+---------------------------+------------------+------+-----+---------------------+----------------+
| id                        | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| created_at                | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at                | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
+---------------------------+------------------+------+-----+---------------------+----------------+

共有2个答案

徐安康
2023-03-14

它看起来像table2有1行。那是正确的吗?每个表有多少行?

由于表2中只有一行,优化器似乎决定从一开始就把它去掉。

在所有情况下,PRIMARYKEY(id),特别是如果您使用InnoDB,对于

    where     table1.id < $number
    order by  table1.id desc

但是,如果表的大部分都有id

请记住,查询有数百万种变化。虽然我很欣赏你试图隔离查询的重要部分;但你可能会发现,将任何答案应用回“真实”查询可能会遇到其他问题。

方玄天
2023-03-14

它的性能如何?(Ooops.更正)

select  *
    from  
      ( SELECT  table1.id as table1_id
            from  table1
            where  table1.id < 100000
            order by  table1.id desc
            limit  1000
      ) t1
    inner join  table2 on t1.table2_id = table2.id
    left join   table3 on t1.table3_id = table3.id
    order by  t1.id; 
 类似资料:
  • 由于没有快速的lambda计算器,我使用上面的策略将非类型化lambda演算的术语编译为Haskell,以便快速计算它们。我对它的性能印象深刻:该程序创建了一个从到的数字列表,并在我的计算机上在不到一秒钟的时间内将它们相加。这比我预期的要快得多--只比Haskell直接等价物慢4倍--并且足以对我的目标有用。但是,请注意,为了满足类型系统的需要,我必须将函数和术语包装在fun/num构造函数下面。

  • 所以我正在做一个需要xml模式的小项目,我对这个模式很不熟悉。 我希望能够设置模式以在两组属性之间进行选择,根据我的研究,这在XSD 1.0中是不可能的,但显然是XSD 1.1的一个特性。 目前我正在使用VisualStudio来完成我的工作,它似乎被困在XSD1.0模式中,这是有意义的,因为XSD1.1显然是一个最新的开发。 我的问题是,是否有一个插件/扩展可以让我在Visual Studio中

  • 问题内容: 我写了一个查询来查找3月至4月美国10个最繁忙的机场。它产生所需的输出,但是我想尝试进一步优化它。 是否有任何适用于查询的HiveQL特定优化? 是适用在这里吗?我是Hive的新手,现在这是我提出的最短的查询。 表列如下: 飞机场 Flights_stats 问题答案: 按机场(内部联接)过滤,并在UNION ALL之前进行聚合,以减少传递到最终聚合简化程序的数据集。具有UNION A

  • 我制作一个浏览器只是为了练习我的Java技能,有没有办法让我的地址栏(JTextField)比swing的默认值更大,也更弯曲。这是我的密码。 我想制作一个真正可用的浏览器,就像我想让html及其CSS页面显示一样,我还需要学习什么才能使其工作。

  • 问题内容: 请考虑以下表格: 部 员工 编写查询以返回人员总数为4或更多的那些部门的雇员的empname和deptname列。记录应按姓氏的字母顺序返回 这是我的看法: 您将如何对此进行改进? 问题答案: 这比较短,而且执行速度可能也更快 从分组开始。您不需要内部查询中的COUNT。然后,联接两个表只是为了获得名称。 *之所以使用 *INNER JOIN, 是因为一旦计数完成,我们已经知道 员工存

  • 问题内容: 我在实现Runnable的类中的run()中调用的方法被设计为引发异常。 但是Java编译器不允许我这样做,建议我用try / catch包围它。 问题是,通过用try / catch包围它,我使 特定的 run()无效了。我 确实 想抛出该异常。 如果我指定的run()的本身,编译器会抱怨说。 通常,我对run()不会抛出异常完全满意 。但是,在我必须具有该功能的特殊情况下。 如何解