Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL MyISAM表性能问题再探讨_Sql_Mysql_Performance_Query Optimization_Myisam - Fatal编程技术网

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