假设我的表格如下:
+----+----------+------------+-------+------+
| 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秒。)
提前致谢
答案 0 :(得分:0)
你应该避免在大桌子上进行自我连接。它妨碍了很多表现。
顺便说一下,你应该在列类别上做索引。并通过查询执行计划查看差异。
答案 1 :(得分:0)
尝试以下变体
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-100毫秒,但它们需要添加附加字段/触发器。所以,如果你不是每分钟都去寻求那个问题,那么就没那么做了。
请注意,即使您的请求,40秒也是太多了。可能你雇用mysql管理员调整你的mysql服务器(使用更多的RAM连接,增加密钥缓冲等)