繁体   English   中英

Mysql自加性能

[英]Mysql Self-Join Performance

假设我有一个如下表:

+----+----------+------------+-------+------+
| id | category |      state | A1code| val  |
+----+----------+------------+-------+------+
|  1 |        1 |    Florida | 13000 | 12   |
|  2 |        1 |    Florida | 13001 | 14   |
|  3 |        1 |    Florida | 13002 | 15   |
|  4 |        2 |    Florida | 13000 | 12   |
|  5 |        2 |    Florida | 13001 | 17   |
|  6 |        2 |    Florida | 13002 | 16   |
|  7 |        1 |  Calfornia | 13000 | 15   |
|  8 |        1 |  Calfornia | 13001 | 13   |
|  9 |        1 |  Calfornia | 13002 | 14   |
| 10 |        2 |  Calfornia | 13000 | 12   |
| 11 |        2 |  Calfornia | 13001 | 14   |
| 12 |        2 |  Calfornia | 13002 | 16   |
....
+----+----------+------------+------+

我需要以这种方式获得结果:

state, A1code, category1, category2
Florida,13000, 12,12
Florida,13001, 14,17
Florida,13002, 15,16
Calfornia,13000, 15,12
Calfornia,13001, 13,14
Calfornia,13002, 14,16
....

我现在看到像这样的SQL:

SELECT A.STATE, A.A1CODE, A.val AS category1, B.val AS category 2
FROM DUMMY_TABLE A
INNER JOIN DUMMY_TABLE B
USING (STATE,A1CODE)
WHERE A.category = 1 AND B.category = 2;

并且使用大约60k长的表,此查询需要大约40秒才能在计算机上运行。

现在有了像这样的查询

SELECT A.STATE, A.A1CODE, A.val AS category1
FROM DUMMY_TABLE A
WHERE A.category = 1

运行时间小于0.1秒,我想要的只是结合两个类别的结果,必须有更快的方法来做到这一点?

(当我尝试将数据库从MS ACCESS移植到MYSQL时出现此问题。在MYSQL上花费大约40秒的相同查询在MS ACCESS中运行需要大约1秒。)

提前致谢

你应该避免在大桌子上自我加入。 它妨碍了很多性能。

顺便说一下,你应该在列类别上做索引。 并通过查询执行计划查看差异。

尝试以下变体

  SELECT A.STATE, A.A1CODE, A.val AS category1, B.val AS category 2
    FROM (select A.STATE A.A1code, A.val as category1 from DUMMY_TABLE A  where A.category = 1 ) as A
    LEFT JOIN DUMMY_TABLE B
    USING (STATE,A1CODE)
    WHERE B.category = 2  ;

它必须快得多。

但实际上取决于1)您在第一次查询中有多少列2)您是否在A1CODE,STATE或不具有索引。

所以加快尝试

create index DUMMY_TABLE_get on DUMMY_TABLE(A1CODE,STATE);

还有一些方法可以将此查询加速到10-100ms,但它们需要添加aditional字段/触发器。 所以,如果你不是每分钟都去寻求那个问题那么就没有那样做。

请注意,即使您的请求,40秒也是太多了。 可能你雇用mysql管理员调整你的mysql服务器(使用更多的RAM连接,增加密钥缓冲等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM