我有一个MySQL 5.0查询定期需要14秒以上,从网页调用,用户不耐烦。这很简单,从2个表中选择11列。我有三个问题:
SQL:
select table1.id, table1.DateOpened, table1.Status, table2.Name, etc
from (table1 join table2 on((table1.CurrentName = table2.id)))
where table1.Type = 'Add' and (Status = 'Open' OR Status = 'Pending');
表/列信息:
table1 has 750,000 rows, table2 1.5M rows.
indexed: table1.id, table2.id
INT columns: id, table1.CurrentName
table1.Status = always populated with 1 of 4 values,
maybe 300 are 'Open' or 'Pending'
table1.Type = 3 possible values: 'Add', 'Change', or null
在FROM中加入是否有任何优势,而在WHERE子句中添加'table1.CurrentName = table2.id'是什么?
有3个WHERE子句(使用连接)。我使用各种订单组合运行EXPLAIN,结果似乎相同。
我认为向table1.CurrentName添加一个索引可能会有所帮助,但现在我想不到。我修改了查询以删除对table2的引用,但它仍然运行缓慢。 (见3b)
似乎减速的大部分可能只是阅读800K记录,查看类型和状态值。索引这两列是否有意义,其中只有3或4个可能的值?我认为只有更多独特的价值观才有意义。
解释结果:
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+
| 1 | SIMPLE | table1 | ALL | CurrentName | NULL | NULL | NULL | 733190 | Using where |
| 1 | SIMPLE | table2 | eq_ref | PRIMARY | PRIMARY | 4 | db.table1.CurrentName | 1 | |
+----+-------------+--------+--------+---------------+---------+---------+-----------------------+--------+-------------+
2 rows in set (0.00 sec)
答案 0 :(得分:2)
加入的位置是否重要?
他们写的顺序对INNER JOINs无关紧要。
where子句的顺序是否重要,或MySQL是否会优化?
没有。 WHERE子句中的书面顺序与MySQL查询解析器和优化器
无关在我的情况下会和索引有帮助吗?
潜在。 table1上的复合索引type_status(Type,Status)可以提供帮助,因为这是WHERE子句可以减少读取的初始行的位置。
在FROM中加入是否有任何优势,而在WHERE子句中添加'table1.CurrentName = table2.id'是什么?
对于INNER JOIN,JOIN条件是否在FROM子句或WHERE子句中无关紧要。
我认为向table1.CurrentName添加一个索引可能会有所帮助,但现在我想不到。我修改了查询以删除对table2的引用,但它仍然运行缓慢。 (见3b)
table1.CurrentName上的索引对查询没有帮助。
似乎减速的大部分可能只是阅读800K记录,查看类型和状态值。
这加强了我上面的想法。要添加复合索引(在线可能不是一件好事),它就像
ALTER TABLE table1 ADD INDEX type_status (Type, Status);
我认为只有更多独特的价值观才有意义。
选择性肯定有帮助,但高基数不是唯一合适的背景。