优化大表上的简单查询

The*_*ian 6 mysql optimization mysql-5.5

DB:MySQL 5.5.20(WampServer,默认配置)
操作系统:Win 7
HDD:Western Digital 3TB Caviar Green,3.5",IntelliPower,64MB,Sata3 (WD30EZRX)
内存:8GB
MySQL my.ini:http : //pastie.org /私人/go9kaxlmlvirati2txbaa

有问题的查询:

SELECT name.id AS name_id, name.name, cast_info.id,
cast_info.role_id, cast_info.movi​​e_id
FROM cast_info
LEFT JOIN name ON name.id = cast_info.person_id
WHERE cast_info.movi​​e_id = 1000000
ORDER BY cast_info.movi​​e_id ASC

它获取所有参与特定电影的人。问题是它可能需要 0.1 秒到近 2.0 秒的时间。那太长了。当用户需要运行 10k 次时,他们不妨卸载该应用程序。甚至我都没有耐心等待它完成。

编辑:运行查询所需的时间取决于处理它的人数。每 10 人大约 0.1 秒。

解释:

**************************** 1. 行 ******************** *******
id: 1
select_type: SIMPLE
table: cast_info
type: ref
possible_keys: idx_mid,mpi
key: idx_mid
key_len: 4
ref: const
rows: 15
Extra:
************ *************** 2. 行 ****************************
id: 1
select_type:简单
表:名称
类型:eq_ref
可能的
键:PRIMARY ,id_name_idx键:PRIMARY
key_len:4
引用:imdb.cast_info.person_id
行:1
额外的:

表格:

创建表cast_info(
idint(11) NOT NULL AUTO_INCREMENT,
person_idint(11) NOT NULL,
movie_idint(11) NOT NULL,
person_role_idint(11) DEFAULT NULL,
notetext,
nr_orderint(11) DEFAULT NULL,
role_idint(11) NOT NULL,
PRIMARY KEY (id),
KEY idx_pidperson_id),
KEY idx_midmovie_id),
KEY idx_cidperson_role_id),
KEY cast_info_role_id_existsrole_id),
KEY mpimovie_idperson_idid
)ENGINE = MyISAM的AUTO_INCREMENT = 33261692默认字符集= UTF8

创建表name(
idint(11) NOT NULL AUTO_INCREMENT,
namevarchar(110) NOT NULL,
imdb_indexvarchar(12) DEFAULT NULL,
imdb_idint(11) DEFAULT NULL,
gendervarchar(1) DEFAULT NULL,
name_pcode_cfvarchar(5) DEFAULT NULL,
name_pcode_nfvarchar(5) DEFAULT NULL,
surname_pcodevarchar(5) DEFAULT NULL,
md5sumvarchar(32) DEFAULT NULL,
PRIMARY KEY ( id),
KEY idx_name( name(6)),
KEY idx_imdb_id( imdb_id),
KEY idx_pcodecf( name_pcode_cf),
KEY idx_pcodenf( name_pcode_nf),
KEY idx_pcode( surname_pcode),
KEY idx_md5( md5sum),
KEY id_name_idx( id, name)
) 引擎=MyISAM AUTO_INCREMENT=4287972 默认字符集=utf8

谢谢!

编辑:使用 MyISAM 是因为这是一个本地数据库,由一个本地应用程序、一个用户使用。同时只执行一个查询。也因为 IMDbPy 用 InnoDB 构建数据库至少需要一个月的时间......

编辑:转换为 InnoDB 后查询 EXPLAIN:

**************************** 1. 行 ******************** *******
id: 1
select_type: SIMPLE
table: cast_info
type: ref
possible_keys: mpi
key: mpi
key_len: 3
ref: const
rows: 23
Extra:
************** ************* 2. 行 ***************************
id: 1
select_type: SIMPLE
table :名称
类型:eq_ref
可能的
键:PRIMARY,id_name_idx键:PRIMARY
key_len:4
引用:imdb.cast_info.person_id
行:1
额外的:

Ric*_*mes 5

使用 InnoDB 会运行得更快,

  • PRIMARY KEY是“集群”; 这使得查找name速度更快。

  • 一个合适的设置innodb_buffer_pool_size,比如 5G(对于你的 8GB 机器)会缓存很多东西,从而最大限度地减少 10K 操作的 I/O。

您还可以通过使用MEDIUMINT UNSIGNEDSMALLINT UNSIGNED在适当的情况下缩小数据(并减少 I/O)。

有可以(应该)删除的冗余索引;这将加快负载。也name(6)大概是没用的。