如果我已经在MySQL中声明了一个多列唯一键,我是否需要添加一个多列索引?

时间:2017-11-23 09:10:36

标签: mysql

我有一个在我的网站上经常使用的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字段相关的selectuid操作,例如

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。

1 个答案:

答案 0 :(得分:0)

是的,唯一键已经是索引。您不需要创建另一个。其他索引实际上减慢了插入语句。但我不建议删除此索引。您显然需要它来进行更新和选择语句。

当您的insert语句很慢时,您可以通过调整服务器的其他方面(例如buffer_pool的大小)来获得更好的性能。发布服务器的确切版本(SELECT version();的结果)和my.cnf的内容(如果你在Windows上,则发布my.ini)。