我有一个在我的网站上经常使用的MySQL表,此表中有超过250K的记录。它是使用以下sql语句创建的:
SELECT MAX(DateEnd), BalEnd FROM Balances WHERE SourceId = " & hResultSource!id & " GROUP BY BalEnd"
在创建语句中,已经声明了一个多列唯一键,但我想添加一个索引来加速查询。因为经常有
CREATE TABLE `user_favorstocks` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL COMMENT 'user id',
`stockid` varchar(15) NOT NULL COMMENT '.SZ, .SH',
`added_date` varchar(10) NOT NULL COMMENT '20160101',
`is_deleted` tinyint(2) NOT NULL DEFAULT '0' COMMENT '0, 1',
`db_insert_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`db_update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `index_uid_stockid` (`uid`,`stockid`)
);
执行且速度很慢(30-60ms,有时100 + ms)。表格上还有与insert into user_favorstocks (uid, stockid, added_date) values ...
,update
字段相关的select
,uid
操作,例如
stockid
或
update user_favorstocks set is_deleted=1 where uid=xxx and stockid=xxx
我应该像我说的那样添加索引吗?或者select stockid, added_date from user_favorstocks where uid=xxx and is_delete=0
声明是否已经意味着索引创建,所以我不需要这样做?
MySQL版本:
73年5月1日对数
的my.cnf:
unique key
我们目前在16GB服务器和4个CPU内核上运行此服务,并使用InnoDB。
答案 0 :(得分:0)
是的,唯一键已经是索引。您不需要创建另一个。其他索引实际上减慢了插入语句。但我不建议删除此索引。您显然需要它来进行更新和选择语句。
当您的insert语句很慢时,您可以通过调整服务器的其他方面(例如buffer_pool的大小)来获得更好的性能。发布服务器的确切版本(SELECT version();
的结果)和my.cnf的内容(如果你在Windows上,则发布my.ini)。