MySQL MyISAM表性能问题再探讨
这个问题涉及到 我有一个具有以下结构的页面表:MySQL MyISAM表性能问题再探讨,sql,mysql,performance,query-optimization,myisam,Sql,Mysql,Performance,Query Optimization,Myisam,这个问题涉及到 我有一个具有以下结构的页面表: 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,
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的文本。数据列中存储的数据的总大小约为1.5GB
执行此查询需要0.08秒:
但执行此查询大约需要130.0秒:
如您所见,我在page.pageid上有一个主索引,在page.sourceid上有一个索引。那么,第二个查询是否需要那么长的时间
编辑1
解释返回
很抱歉,分析不起作用。。。MySQL及其4.1.22无法识别SHOW PROFILE查询
显示返回的索引
您的sourceid字段有多大不同?如果与行数相比,您只有几个不同的sourceid值,那么您可以尝试增加索引的大小。您是否尝试强制使用索引?比如:
SELECT sourceid FROM page USE INDEX (sourceid_index)
与sgehrig注释一样,使用EXPLAIN检查是否使用了索引?并分享结果
EXPLAIN select sourceid from page
这也有助于分享索引的定义:
SHOW INDEX FROM page
由于MySQL 4.1.22在2006年11月2日已经相当老了,我怀疑它不支持为次键覆盖索引的概念。EXPLAIN显示查询实际上使用了索引,因此我假设在使用覆盖索引提取sourceid列时,读取所有结果行需要额外的时间,而不仅仅是返回索引内容
您是否可以在较新的MySQL服务器版本上检查该查询?请执行解释,从页面中选择sourceid并为此查询启用pforing:SET profiling=1;,执行查询,显示配置文件;然后禁用分析集分析=2;Oops-首先它应该读取profiling而不是pforiling,然后它应该设置profiling=0;禁用评测。刚刚编辑的post as requestedsourceid包含大约3500个不同的值。它指的是一个大约有3500行的源表。每个来源包含0到700页。我已经修改了问题并添加了您要求的信息。。。从页面选择sql\u no\u缓存sourceid使用索引sourceid工作,查询耗时0.09秒。出于某种原因,mysql无法自行确定要使用的索引。我现在需要一个查询,强制在级联连接页面详细信息>页面>源中创建索引。您真的能确认只有SQL\u NO\u缓存和USE index的组合才能带来预期的速度优势吗?是否SQL\u NO\u缓存是决定因素?我使用SQL\u NO\u缓存来测试查询的实际性能。如果我不使用这个关键字,这是我通常做的查询第一次运行缓慢,稍后查询结果来自缓存,这总是更快,但不是问题的解决方案。SQL\u NO\u缓存强制mysql不在缓存中使用/保存结果,返回正常情况下查询所需的实际时间。这正是我问的原因-我想排除查询缓存对执行时间有一定影响的选项。因此,显然MySQL需要索引提示来使用覆盖索引。
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)
EXPLAIN select sourceid from page
SHOW INDEX FROM page