2013-04-27 39 views
1

我遇到了一個查詢的速度問題,我不想做。 房間表中有2685588行,而room_active小於100,但對於普通查詢來說速度並不慢。緩慢的查詢與類似的位置,排序和限制

查詢是:

SELECT rooms.*, room_active.active_users 
FROM rooms LEFT JOIN room_active ON (room_active.roomid = rooms.id) 
WHERE caption LIKE '%room%' ORDER BY room_active.active_users LIMIT 50 

運行:4.3s

它需要5秒以上來執行時,它應該不到一個喜歡做這一個:

SELECT rooms.*, room_active.active_users 
FROM rooms LEFT JOIN room_active ON (room_active.roomid = rooms.id) 
WHERE caption LIKE '%room%' LIMIT 50 

運行時間:0.3s

的描述第一個查詢是這樣的:

+----+-------------+-------------+--------+----------------+---------+---------+----------------+---------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref   | rows | Extra          | 
+----+-------------+-------------+--------+----------------+---------+---------+----------------+---------+----------------------------------------------+ 
| 1 | SIMPLE  | rooms  | ALL | NULL   | NULL | NULL | NULL   | 2210576 | Using where; Using temporary; Using filesort | 
| 1 | SIMPLE  | room_active | eq_ref | PRIMARY,roomid | PRIMARY | 4  | xukys.rooms.id |  1 | NULL           | 
+----+-------------+-------------+--------+----------------+---------+---------+----------------+---------+----------------------------------------------+ 

指標:

+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| rooms |   0 | PRIMARY  |   1 | id   | A   |  2210613 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | owner  |   1 | owner  | A   |  2210613 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | roomtype |   1 | roomtype | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | caption  |   1 | caption  | A   |  2210613 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | category |   1 | category | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | users_now |   1 | users_now | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | tags  |   1 | tags  | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | users_max |   1 | users_max | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | description |   1 | description | A   |  368435 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | state  |   1 | state  | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | model_name |   1 | model_name | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | public_ccts |   1 | public_ccts | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | score  |   1 | score  | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | password |   1 | password | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | icon_bg  |   1 | icon_bg  | A   |   954 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | icon_fg  |   1 | icon_fg  | A   |   18 | NULL  | NULL |  | BTREE  |   |    | 
| rooms |   1 | badge_id |   1 | badge_id | A   |   804 | NULL  | NULL |  | BTREE  |   |    | 
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
+-------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table  | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| room_active |   0 | PRIMARY  |   1 | roomid  | A    |   116 | NULL  | NULL |  | BTREE  |   |    | 
| room_active |   0 | roomid  |   1 | roomid  | A   |   116 | NULL  | NULL |  | BTREE  |   |    | 
| room_active |   1 | active_users |   1 | active_users | A   |   29 | NULL  | NULL |  | BTREE  |   |    | 
+-------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
+0

嘗試一個較小的結果集.'ORDER BY'正在殺死你的表現。 – Kermit 2013-04-27 03:33:07

+0

你在哪裏編制索引?在room_active.active_users上添加索引應該有助於訂購 – Rikon 2013-04-27 03:43:02

+0

表room_active具有2列,roomid和active_users兩者都是分別索引的。房間表中的查詢也使用這些列。 – 2013-04-27 03:49:59

回答

1

ORDER BY被移除的LIMIT 50優勢,因爲能夠通過他對50個第一要素訂購獲取所有記錄。

也許如果你告訴我們你想要什麼,我們可以幫助查詢。例如,你是否真的需要做一個LEFT JOIN,並讓所有沒有room_active的房間?

不知道是否有幫助,但試試這個

SELECT rooms.*, room_active.active_users 
FROM room_active ra JOIN rooms r ON (room_active.roomid = rooms.id) 
WHERE r.caption LIKE '%room%' ORDER BY ra.active_users LIMIT 50 

將忽略不具有room_active房間,降低了提取的記錄

+0

我需要根據裏面的用戶數量(room_active)來訂購50個房間,那是什麼用於左連接。如果房間內有用戶,它將在該表中,並將被訂購。 – 2013-04-27 03:48:44

+0

和room_active總是有一個房間ID,所以JOIN和LEFT JOIN是相同的? – 2013-04-27 03:54:32

+0

並非總是在房間內有用戶的時候。這就是我使用LEFT JOIN的原因。 – 2013-04-27 03:57:50

0

1,你可能想也許在指數命令?

2你不需要%room%嗎?房間%會更快,你有效地搜索所有文件,如果你不

3如果你可以,只有想要活躍?而不是內連接,因爲它需要較少的連接(它不連接那些空連接)

4不要選擇*除非需要?

5.也許你可以使用一個不同的充功能,例如包含,如果你使用的是Oracle

6.將指數說明它是搜索質量也許這就是問題

+0

我已經使用索引更新了問題,因爲您可以看到在查詢中使用的所有索引都已編入索引。我確實需要%room%,房間%比較快,但我需要第一個。 INNER JOIN沒有唱片節目。我確實需要房間表中的所有列以供我的應用程序使用。 – 2013-04-27 03:58:38

+0

想'____'是實際嗎?[下劃線允許任何字符的特定插槽,如果它有不同的前綴解決方案可能不可行;如果你使用的是oracle,你也可以試着做一個實例化的視圖,這可能會將結果降低到50-500毫秒,另一種解決方案可能是規範化查詢,以便不需要連接;其中一個問題很可能是它在對它們進行限制之前對所有2000000個結果進行了排序,這對性能造成相當大的影響 – kevinn2065 2013-04-27 04:04:15

0

按照下面的步驟和檢查性能。

  1. 在字段'caption'上爲其前4個字符和'active_users'創建索引。
  2. 而不是「rooms。*」,顯式選擇字段。
  3. 使用「caption LIKE'room%'」而不是「caption LIKE'%room%'」。

如果這仍然很慢,您應該爲您的聯接查詢創建一個視圖,然後在視圖上執行簡單的select語句。

+0

列標題已經有一個索引,請認真查看問題。我需要所有的字段,這可能會導致一些毫秒的延遲,而不是4秒...我需要使用%房間%爲我的應用程序。 – 2013-04-27 04:06:12