我有一张包含6098369条记录的表格并且正在增长。 查询真的很慢,我想知道你是否对我的情况有任何提示。
这是create table语句:
CREATE TABLE `sametime`.`message` (
`messageID` int(100) unsigned NOT NULL AUTO_INCREMENT,
`timestamp` datetime DEFAULT NULL,
`userFrom` varchar(80) DEFAULT NULL,
`userTo` varchar(80) DEFAULT NULL,
`msg` varchar(65000) DEFAULT NULL,
`conversationID` int(100) DEFAULT NULL,
PRIMARY KEY (`messageID`),
KEY `userFromIndex` (`userFrom`(5)),
KEY `userToIndex` (`userTo`(5)),
KEY `timestampIndex` (`timestamp`)
) ENGINE=InnoDB AUTO_INCREMENT=6098370 DEFAULT CHARSET=latin1;
正如你所看到的,我已经添加了索引,希望能够正常工作。
任何提示?
答案 0 :(得分:4)
如果没有看到你的select语句,很明显在VARCHAR用户名上搜索这个表要比在整数索引字段上搜索要慢得多。 您应该考虑将用户名移动到单独的表中,并在此表中使用userNo外键。
另外,对话ID没有索引?这不是一个关键的查找字段吗?
除了ceejayoz提到的那样,MySQL的EXPLAIN语句应该是你的第一个途径。
答案 1 :(得分:1)
没有看到缓慢的实际查询...
尝试使用UserFrom,Timestamp
和UserTo,Timestamp
上的compound index。
答案 2 :(得分:1)
没有特定的查询和EXPLAIN输出可以说不多。但是我会将msg
从VARCHAR(650000
更改为TEXT
,因为MySQL会将每个行放入内存中,因此会分配整个65000字节。
另外我很好奇 - 为什么你使用INT(100)
?它不允许您在2^100
中存储2^32
值,只需INT
作为常规INT(100)
。 {{1}}仅在显示选项AFAIR中有所不同。
答案 3 :(得分:0)
嗯,我想我弄明白了我的主要问题。它很慢的主要原因是我没有将conversationID设置为外键。我还对表设计提出了其他建议。 感谢您的回复