需要以某种方式加快我的数据库或查询

时间:2011-01-23 15:13:39

标签: mysql query-optimization

我在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秒)但是当我尝试加入它们时它会慢慢减慢它...我是正确加入它们还是需要某种特殊索引加入?

2 个答案:

答案 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将使用内存临时表。所以使小结果查询更快