[英]Table converted from myISAM to INNODB is slowing down a query
我有一個從 myISAM 轉換為 INNODB 的表,這會減慢查詢速度。 這是一個有很多索引的大表。 MyIsam(在 mysql5.6 上)立即返回結果,INNODB(在 mysql5.7 上)需要 2 到 3 秒。 fnota 是浮動的。 serieid 和 epnumber 是整數。 知道為什么在執行 index_merge 時需要更多時間嗎?
在 MISAM TABLE 上解釋:
explain SELECT count( fnota ) , avg( fnota ) FROM myrates
WHERE serieid =4376 AND epnumber ='149'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: myrates
type: ref
possible_keys: serieid,epnumber,serieid_2
key: serieid_2
key_len: 8
ref: const,const
rows: 8207
Extra: Using index condition
在 INNODB 表上解釋:
explain SELECT count( fnota ) , avg( fnota ) FROM myrates
WHERE serieid =4376 AND epnumber ='149'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: myrates
partitions: NULL
type: index_merge
possible_keys: serieid,epnumber,serieid_2
key: serieid,epnumber,serieid_2
key_len: 4,4,8
ref: NULL
rows: 2
filtered: 100.00
Extra: Using intersect(serieid,epnumber,serieid_2); Using where
索引:
SHOW INDEX FROM myrates;
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| myrates | 0 | fbid | 1 | userid | A | 1405506 | NULL | NULL | | BTREE | | |
| myrates | 0 | fbid | 2 | serieid | A | 8617224 | NULL | NULL | | BTREE | | |
| myrates | 0 | fbid | 3 | epnumber | A | 139638192 | NULL | NULL | | BTREE | | |
| myrates | 1 | serieid | 1 | serieid | A | 257656 | NULL | NULL | | BTREE | | |
| myrates | 1 | epnumber | 1 | epnumber | A | 93431 | NULL | NULL | | BTREE | | |
| myrates | 1 | serieid_2 | 1 | serieid | A | 186213 | NULL | NULL | | BTREE | | |
| myrates | 1 | serieid_2 | 2 | epnumber | A | 3309332 | NULL | NULL | | BTREE | | |
| myrates | 1 | userid | 1 | userid | A | 866339 | NULL | NULL | | BTREE | | |
| myrates | 1 | userid | 2 | serieid | A | 4656575 | NULL | NULL | | BTREE | | |
+---------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
SHOW CREATE TABLE MYRATES;
Table: myrates
Create Table: CREATE TABLE `myrates` (
`userid` bigint(10) NOT NULL,
`serieid` int(6) NOT NULL,
`epnumber` float NOT NULL,
`nota` int(6) NOT NULL DEFAULT '0',
`fnota` float NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `fbid` (`userid`,`serieid`,`epnumber`),
KEY `serieid` (`serieid`),
KEY `epnumber` (`epnumber`),
KEY `serieid_2` (`serieid`,`epnumber`),
KEY `userid` (`userid`,`serieid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
DESCRIBE
並沒有准確地說明您擁有的索引。 請提供SHOW CREATE TABLE
。 聽起來您對一長串重疊索引感到困惑。
當您擁有諸如(serieid, epnumber)
類的復合索引時,您也不需要(serieid)
。 刪除后一個索引以“解決”問題。
鑒於“fbid”的兩列都以相同的順序開始,因此鍵“userid”似乎也是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.