【问题标题】:SQL query to execute faster - no relationship among tables - generate result quickerSQL 查询执行得更快 - 表之间没有关系 - 更快地生成结果
【发布时间】:2016-07-12 14:40:10
【问题描述】:

我有 4 个单独的表格,如下所示,每个表格都有相同的 5 列(ID、Shape1、Shape2、Shape3、Shape4)。所有 4 个表之间都没有关系。想不出任何可能的关系。

Table Design

每个表有 1 亿行数据,100 X 4 = 4 亿

如果我运行以下查询

SELECT id 
FROM Table1
WHERE 'Shape1' = 400 AND Shape 'Shape2' = 300 AND 'Shape3' = 500 AND 'Shape4' = 200

它在 1.232 秒内搜索每个表。这就是瓶颈所在,当单独运行时,我必须等待 9.032 秒才能完成所有四个查询。

我也尝试了如下的 UNION 但它真的很慢 17.042 秒 UNION

不确定在这里加入表,因为没有任何东西可以连接在一起。我知道

我的问题:- 你能一起搜索所有这些表吗?在单个查询中组合或单独执行查询是更快执行的唯一方法。

机器数据库:- win 7 X64 - 64 GB RAM COREi7 SSD 磁盘。

DB 信息:- 用于测试的内存表,以实现每表 1.232 秒 - 选择语句

DB 生产:- MyISAM 表每张表达到 2.808 秒 - Select 语句

【问题讨论】:

  • 请提供EXPLAIN SELECT id FROM Table1 WHERE 'Shape1' = 400 AND Shape 'Shape2' = 300 AND 'Shape3' = 500 AND 'Shape4' = 200UNION 查询的结果。正如 Gordon Linoff 的回答中所述,将列作为一个组进行索引将加快包含每列条件的查询。
  • 一个你没有提到的选项——将这些表合并成一个表......然后你就只有一个表了!!
  • @Hogan 如果我将表格组合在一起,它会变得非常慢(因为大小),第二件事是更难分辨形状是在哪个区域排序的
  • @fyrye 给你link
  • @AdamHochker 我这里有一张表,里面有超过 20 亿行,而且速度不慢,如果设计得当,大小与速度无关

标签: mysql sql database performance


【解决方案1】:

这个查询:

SELECT id 
FROM Table1
WHERE 'Shape1' = 400 AND Shape 'Shape2' = 300 AND 'Shape3' = 500 AND 'Shape4' = 200

可能不符合您的预期。它应该不返回任何行,因为您将字符串与整数进行比较。

这样写:

SELECT id 
FROM Table1
WHERE Shape1 = 400 AND Shape2 = 300 AND Shape3 = 500 AND Shape4 = 200

所有比较都是相等比较。所以,试试这个索引:

CREATE INDEX idx_table1_5 ON table1(Shape1, Shape2, Shape3, Shape4, id);

这应该会加快第一次查询的速度。您可以为其他表创建类似的索引。

注意:前四列的顺序无关紧要。但id 应该是最后一个。

【讨论】:

  • 您也可以将'(单引号)替换为`(反引号),例如:`Shape1`
  • @fyrye 。 . .无需转义名称,因此不需要反引号。
  • 最好的做法是总是逃避,尽管它不是必需的。虽然我的评论是提供背景说明为什么反引号被 OP 误解为单引号。
  • @AdamHochker 你可以用 UNION ALL 做到这一点,但这不会让它更快,索引会。
  • @GordonLinoff 您的索引提示有很大的不同,查询返回显示行 0 - 0(共 1 个,查询耗时 0.0000 秒。)非常感谢您的帮助
猜你喜欢
  • 2011-06-04
  • 2021-12-06
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多