2012-12-27 40 views
-1

我的查詢超過30分鐘跑步的時間延長。它是一個簡單的查詢,甚至包含索引also.we無法找到它爲什麼被佔用太多的執行時間和它影響我們的整個數據庫性能。 昨天跑來跑去:122.6mins 任何一個能幫助我here.how來提高查詢性能任何一個能幫助我here.how來提高查詢性能

This is my query: 
SELECT tab1.customer_id,tab1.row_mod,tab1.row_create,tab1.event_id,tab1.event_type, 
tab1.new_value,tab1.old_value FROM tab1 force index (tab1_n2)where customer_id >= 1 and customer_id 
< 5000000 and (tab1.row_mod >= '2012-10-01') or (tab1.row_create >= '2012-10-01' and tab1.row_create < '2012-10-13'); 

Explain plan 

+----+-------------+------------------+------+---------------------+------+---------+------+----------+-------------+ 
| id | select_type | table   | type | possible_keys  | key | key_len | ref | rows  | Extra  | 
+----+-------------+------------------+------+---------------------+------+---------+------+----------+-------------+ 
| 1 | SIMPLE  | tab1 | ALL | tab1_n2 | NULL | NULL | NULL | 18490530 | Using where | 
+----+-------------+------------------+------+---------------------+------+---------+------+----------+-------------+ 
1 row in set (0.00 sec) 

Table structure: 

mysql> show create table tab1\G 
*************************** 1. row *************************** 
     Table: tab1 
Create Table: CREATE TABLE `tab1` (
    `customer_id` int(11) NOT NULL, 
    `row_mod` datetime DEFAULT NULL, 
    `row_create` datetime DEFAULT NULL, 
    `event_id` int(11) DEFAULT NULL, 
    `event_type` varchar(45) DEFAULT NULL, 
    `new_value` varchar(255) DEFAULT NULL, 
    `old_value` varchar(255) DEFAULT NULL, 
    KEY `customer_id1` (`customer_id`), 
    KEY `new_value_n1` (`new_value`), 
    KEY `tab1_n1` (`row_create`), 
    KEY `tab1_n2` (`row_mod`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

請幫助我如何調整它。即使它使索引也

+0

請檢查您是否已經對row_mod綜合指數和row_create如果沒有的話建立一個 – Deepesh

+1

你錯誤地使用**和**和**或在您的查詢的關鍵字**檢查和更新你的問題。 –

回答

0

可能是因爲您在使用一個沒有意義的索引。

的row_mod條件只有一個OR條件的分支,讓指數在這裏是沒有太大的幫助。如果您在不刪除任何行的情況下通過索引強制執行每次查找,則這可能比全表掃描慢很多。好的經驗法則是索引應該消除超過90%的行。

嘗試沒有「力指數」的一部分來做。

+0

當我們沒有強制執行索引時,它也採取同樣的時間,沒有結果。 – pvr

+0

沒有結果?你是說結果與沒有強制指數不同? – Thilo

+0

沒有結果意味着沒有性能上的變化。我也嘗試過複合指數,但沒有運氣。 – pvr

0

嘗試使用這兩個條件的聯合。這樣每個條件都可以使用索引。

ALTER TABLE tab1 ADD INDEX idx_row_mod_customer_id (row_mod, customer_id); 

ALTER TABLE tab1 ADD INDEX idx_row_create (row_create); 

SELECT tab1.customer_id, tab1.row_mod, tab1.row_create, tab1.event_id, tab1.event_type, 
tab1.new_value, tab1.old_value 
FROM tab1 
WHERE customer_id >= 1 and customer_id 
< 5000000 AND tab1.row_mod >= '2012-10-01' 

UNION 

SELECT tab1.customer_id, tab1.row_mod, tab1.row_create, tab1.event_id, tab1.event_type, 
tab1.new_value, tab1.old_value 
FROM tab1 
WHERE tab1.row_create >= '2012-10-01' AND tab1.row_create < '2012-10-13'; 

爲了進一步優化,你可以選擇所有的列添加到這兩個指標,從有到行加載到存儲器中保存的MySQL。這將大大增加指數的大小,從而大大增加其內存需求。