我的查询存在性能问题。这是表模式:
CREATE TABLE `file_info` (
`FILE_NAME` varchar(255) DEFAULT '',
`START_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`FILE_SIZE` int(10) NOT NULL DEFAULT '0',
`LOG_SERVER_NAME` varchar(255) NOT NULL DEFAULT '',
`PHASE` varchar(255) NOT NULL DEFAULT '',
`APPLICATION` varchar(255) NOT NULL DEFAULT '',
`TYPE` varchar(255) NOT NULL DEFAULT '',
`FULLPATH` varchar(255) NOT NULL DEFAULT '',
`COMPRESSED` tinyint(1) NOT NULL DEFAULT '0',
`CLOSED` tinyint(1) NOT NULL DEFAULT '0',
`ARCHIVED_PATH` varchar(255) NOT NULL DEFAULT '',
`FILE_TYPE` varchar(45) NOT NULL DEFAULT '',
PRIMARY KEY (`LOG_SERVER_NAME`,`FULLPATH`),
UNIQUE KEY `uk_file_info` (`LOG_SERVER_NAME`,`FULLPATH`,`APPLICATION`) USING BTREE,
KEY `IDX_STARTTIME` (`START_TIME`),
KEY `IDX_ENDTIME` (`END_TIME`),
KEY `IDX_PHASE` (`PHASE`),
KEY `IDX_APLICATION` (`APPLICATION`),
KEY `IDX_LOGSERVERNAME` (`LOG_SERVER_NAME`),
KEY `IDX_FULLPATH` (`FULLPATH`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
这是我的查询:
SELECT * FROM FILE_INFO
WHERE PHASE ='DEV'
AND APPLICATION ='SIALT'
AND ((START_TIME <'2014-11-11 08:17:00' AND END_TIME >'2014-11-11 08:17:00')
OR (START_TIME <'2014-11-11 08:22:00' AND END_TIME >'2014-11-11 08:22:00')
OR (START_TIME >'2014-11-11 08:17:00' AND END_TIME <'2014-11-11 08:22:00'))
该查询需要大量时间。有时超过30秒。
我将索引放在要过滤的字段上。我之所以使用MyISAM,是因为我了解数据库没有外键会更好。
因此,我正在寻找新的想法来改善我的查询。今天几乎无法使用。
添加自动增量键会有所帮助吗?即使我不按ID进行过滤?从MyISAM更改为InnoDB?
编辑
解释给
id 1
select_type SIMPLE
table FILE_INFO
type ref
possible_keys IDX_STARTTIME,IDX_ENDTIME,IDX_PHASE,IDX_APLICATION
key IDX_APLICATION
key_len 257
ref const
rows 756718
Extra Using index condition; Using where
我将尝试其他建议并更新我的帖子。
感谢您的提示。
罗曼
感谢所有的建议。
我更改了索引,以将我的所有where子句都包含在主键中。这还不够。
我看到基于datetime的分区未正确使用。因此,我要做的是创建一个新的日期字段(基于start_time)。而且分区可以很好地配合日期(无时间)。
这是最后的查询:
SELECT * FROM FILE_INFO
WHERE PHASE ='PDT' AND APPLICATION ='SIALT'
AND FILE_DATE = '2014-12-10'
AND ((START_TIME <'2014-12-10 08:17:00' AND END_TIME >'2014-12-10 08:17:00')
OR (START_TIME <'2014-12-10 17:22:00' AND END_TIME >'2014-12-10 17:22:00')
OR (START_TIME >'2014-12-10 08:17:00' AND END_TIME <'2014-12-10 17:22:00'))
我猜由于某些原因,在start_time上的索引只是无法正常工作。我可以解释一下非常糟糕的表现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句