|
hi,
I have here one query where the optimizer often takes the wrong decision:
explain SELECT * FROM `syslog` WHERE 1 AND `device_id` = '51' AND (( (`device_id` != '' AND `device_id` IS NOT NULL))) ORDER BY `seq` DESC LIMIT 0,20
|
|
+------+-------------+--------+-------+-----------------------------------------------------------+---------+---------+------+------+-------------+
|
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|
+------+-------------+--------+-------+-----------------------------------------------------------+---------+---------+------+------+-------------+
|
| 1 | SIMPLE | syslog | index | device_id,device_priority,device_program,device_timestamp | PRIMARY | 8 | NULL | 8414 | Using where |
|
+------+-------------+--------+-------+-----------------------------------------------------------+---------+---------+------+------+-------------+
|
1 row in set (0.10 sec)
|
|
SELECT * FROM `syslog` WHERE 1 AND `device_id` = '51' AND (( (`device_id` != '' AND `device_id` IS NOT NULL))) ORDER BY `seq` DESC LIMIT 0,20;
|
20 rows in set (2 min 21.60 sec)
|
|
explain SELECT * FROM `syslog` WHERE 1 AND `device_id` = '52' AND (( (`device_id` != '' AND `device_id` IS NOT NULL))) ORDER BY `seq` DESC LIMIT 0,20
|
|
+------+-------------+--------+------+-----------------------------------------------------------+-----------+---------+-------+--------+-------------+
|
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|
+------+-------------+--------+------+-----------------------------------------------------------+-----------+---------+-------+--------+-------------+
|
| 1 | SIMPLE | syslog | ref | device_id,device_priority,device_program,device_timestamp | device_id | 5 | const | 293166 | Using where |
|
+------+-------------+--------+------+-----------------------------------------------------------+-----------+---------+-------+--------+-------------+
|
1 row in set (0.06 sec)
|
|
SELECT * FROM `syslog` WHERE 1 AND `device_id` = '52' AND (( (`device_id` != '' AND `device_id` IS NOT NULL))) ORDER BY `seq` DESC LIMIT 0,20;
|
20 rows in set (0.03 sec)
|
Table: syslog
Create Table: CREATE TABLE `syslog` (
|
`device_id` int(11) DEFAULT NULL,
|
`host` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'Hostname or IP received by syslog server',
|
`facility` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
|
`priority` tinyint(4) NOT NULL DEFAULT '8',
|
`level` tinyint(4) NOT NULL DEFAULT '8',
|
`tag` varchar(32) CHARACTER SET utf8 DEFAULT NULL,
|
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
`program` varchar(64) CHARACTER SET utf8 DEFAULT NULL,
|
`msg` text CHARACTER SET utf8,
|
`seq` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
PRIMARY KEY (`seq`),
|
KEY `datetime` (`timestamp`),
|
KEY `device_id` (`device_id`),
|
KEY `program` (`program`),
|
KEY `priority` (`priority`),
|
KEY `device_priority` (`device_id`,`priority`),
|
KEY `device_program` (`device_id`,`program`),
|
KEY `device_timestamp` (`device_id`,`timestamp`)
|
) ENGINE=InnoDB AUTO_INCREMENT=53538532 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
|
|