我在2个表上有一个左连接语句:tbl1有大约100万条记录,而tbl2大约有2000万条。查询大约需要9秒才能执行。我有两个索引,但考虑到查询需要多长时间,这似乎不对。这是我的选择声明:
EXPLAIN SELECT * FROM (SELECT tbl1.id, tbl1.name, tbl2.addr FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL) as tempTable GROUP BY id LIMIT 10;
+----+-------------+------------+--------+------------------+--------------+---------+----------------|
id|select_type| table |type |poss_keys|key |key_len|ref | rows | Extra
+----+-------------+------------+--------+------------------+--------------+---------+----------------
1 | PRIMARY | <derived2>|system| NULL |NULL| NULL |NULL | 0 | const row not found |
2 | DERIVED | tbl1 |range |id,name |name| 903 |NULL | 1 | Using where |
2 | DERIVED | tbl2 |ref |id,addr |id | 4 |tbl2.tbl1.id| 25 | Using where |
+----+-------------+------------+--------+------------------+--------------+---------+----------------
更新: 如果我拿出加入声明&amp;只选择tbl1或tbl2中的记录,select语句很快(远低于1秒)但是当我尝试加入它们时它会慢慢减慢它...我是正确加入它们还是需要某种特殊索引加入?
答案 0 :(得分:1)
您可能会稍微简化一下......我认为您不需要临时表或组......
SELECT tbl1.id, tbl1.name, tbl2.addr
FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id
WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL
另外......如果索引似乎不起作用,你可以添加“tble2.id like'G%'”
答案 1 :(得分:0)
您可以尝试许多其他方法
尝试使用
mysql_unbuffered_query
在php方面会让它更快我认为你已经指定限制为10不再需要计数
然后结果只包含10个结果
SQL_SMALL_RESULT
如果使用SQL_SMALL_RESULT选项,MySQL将使用内存临时表。所以使小结果查询更快