sql - MySQL MyISAM 表性能问题重温

标签 sql mysql performance query-optimization myisam

此问题与 this one 相关.

我有一个具有以下结构的页面表:

CREATE TABLE  mydatabase.page (
  pageid int(10) unsigned NOT NULL auto_increment,
  sourceid int(10) unsigned default NULL,
  number int(10) unsigned default NULL,
  data mediumtext,
  processed int(10) unsigned default NULL,
  PRIMARY KEY  (pageid),
  KEY sourceid (sourceid)
) ENGINE=MyISAM AUTO_INCREMENT=9768 DEFAULT CHARSET=latin1;

数据列包含每条记录大小约为 80KB - 200KB 的文本。 data列中存储的数据总大小约为1.5GB。

执行此查询需要 0.08 秒:

select pageid from page

但执行此查询大约需要 130.0 秒:

select sourceid from page

如您所见,我在 page.pageid 上有一个主索引,在 page.sourceid 上有一个索引。那么第二个查询应该花费那么那么长吗?

编辑#1

说明已返回

id select_type table type  possible_keys key      key_len ref rows Extra
1  SIMPLE      page  index               sourceid 5           9767 Using index

很抱歉,分析不起作用...MySQL(其 4.1.22)无法识别 SHOW PROFILE 查询。

显示索引已返回

Table Non_unique Key_name  Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
page  0          PRIMARY   1            pageid      A         9767                             BTREE 
page  1          sourceid  1            sourceid    A         3255                        YES  BTREE 

最佳答案

您是否尝试强制使用索引?喜欢:

SELECT sourceid FROM page USE INDEX (sourceid_index)

像 sgehrig 注释一样,使用 EXPLAIN 检查是否使用了索引?并分享结果?

EXPLAIN select sourceid from page

它还可以帮助分享索引的定义:

SHOW INDEX FROM page

关于sql - MySQL MyISAM 表性能问题重温,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/847154/

相关文章:

sql - 如何查找一年前这一天的数据?

mysql - 将整数连接成二进制字符串并返回

html - -webkit-filter 在单个 div VS 多个 div 上的性能

SQL Server - [SELECT] 是否锁定 [UPDATE]?

你能帮我改进这个吗?

sql - select count(1) 与 select rowcnt from sysindexes 性能和使用?

mysql - 在 MySQL 中,将每一行中的值设置为同一行上的 DATEDIFF 计算

mysql - 如何同步两个不同方案的MySQL数据库?

MySQL 错误 1045 (28000) : Access denied for user 'bill' @'localhost' (using password: YES)

mysql - JPA、Glassfish、Mysql : UTC time conversion occuring twice