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.movie_id
FROM cast_info
LEFT JOIN name ON name.id = cast_info.person_id
WHERE cast_info.movie_id = 1000000
ORDER BY cast_info.movie_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),
KEYidx_pid(person_id),
KEYidx_mid(movie_id),
KEYidx_cid(person_role_id),
KEYcast_info_role_id_exists(role_id),
KEYmpi(movie_id,person_id,id)
)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),
KEYidx_name(name(6)),
KEYidx_imdb_id(imdb_id),
KEYidx_pcodecf(name_pcode_cf),
KEYidx_pcodenf(name_pcode_nf),
KEYidx_pcode(surname_pcode),
KEYidx_md5(md5sum),
KEYid_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
额外的:
使用 InnoDB 会运行得更快,
的PRIMARY KEY是“集群”; 这使得查找name速度更快。
一个合适的设置innodb_buffer_pool_size,比如 5G(对于你的 8GB 机器)会缓存很多东西,从而最大限度地减少 10K 操作的 I/O。
您还可以通过使用MEDIUMINT UNSIGNED或SMALLINT UNSIGNED在适当的情况下缩小数据(并减少 I/O)。
有可以(应该)删除的冗余索引;这将加快负载。也name(6)大概是没用的。
| 归档时间: |
|
| 查看次数: |
4693 次 |
| 最近记录: |