2012-12-27 42 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。这将大大增加指数的大小,从而大大增加其内存需求。