Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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索引几乎没有加快简单查询的速度_Mysql_Sql_Performance_Ubuntu - Fatal编程技术网

MySQL索引几乎没有加快简单查询的速度

MySQL索引几乎没有加快简单查询的速度,mysql,sql,performance,ubuntu,Mysql,Sql,Performance,Ubuntu,我有这个表,它包含大约8000000行 CREATE TABLE `mytable` ( `date` date NOT NULL, `parameters` mediumint(8) unsigned NOT NULL, `num` tinyint(3) unsigned NOT NULL, `val1` int(11) NOT NULL, `val2` int(10) NOT NULL, `active` tinyint(3) unsigned NOT NULL, `ref` int(10)

我有这个表,它包含大约8000000行

CREATE TABLE `mytable` (
`date` date NOT NULL,
`parameters` mediumint(8) unsigned NOT NULL,
`num` tinyint(3) unsigned NOT NULL,
`val1` int(11) NOT NULL,
`val2` int(10) NOT NULL,
`active` tinyint(3) unsigned NOT NULL,
`ref` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ref`) USING BTREE,
KEY `parameters` (`parameters`)
) ENGINE=MyISAM AUTO_INCREMENT=79092001 DEFAULT CHARSET=latin1
它围绕两个主要栏目展开:“参数”和“日期”。 “参数”大约有67000个可能值 对于每个“参数”,大约有1200行,每行都有不同的日期。 因此,对于每个日期,有67000行。 1200*67000=80400000

表大小显示为1.5GB,索引大小显示为1.4GB

现在,我想查询表以检索一个“参数”的所有行 (实际上我想对每个参数都这样做,但这是一个好的开始)

第一次跑步会在8秒内给出结果 不同但接近的参数值(2、3、4…)的后续运行是瞬时的

运行“远离”值(参数=1000)会在8秒内再次给出结果

我在没有索引的情况下运行了相同的查询,并在20秒内得到了结果,因此我猜索引正在启动,如EXPLAIN所示,但性能没有大幅提升:

+----+-------------+----------+------+---------------+------------+---------+-------+------+-------+
| id | select_type | table    | type | possible_keys | key        | key_len | ref   | rows | Extra |
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------+
|  1 | SIMPLE      | mytable  | ref  | parameters    | parameters | 3       | const | 1097 |       |
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------+
但我仍然对这种简单的请求(没有加入,直接在索引上)的时间感到困惑

该服务器使用2年,2 cpu四核,2.6GHz,运行Ubuntu,内存为4G。 我已经将key_buffer参数提高到1G,并重新启动了mysql,但没有发现任何变化


我应该认为这是正常的吗?还是我做错了什么?我觉得使用正确的配置,请求应该是立即的。

尝试使用覆盖索引,即创建一个包含所需两列的索引。它不需要第二个磁盘I/O来从主表获取值,因为数据就在索引中。

它可能是从磁盘读取的。检查OS io统计数据。是的,它似乎正在从磁盘读取数据,尽管它说它正在使用索引。我如何确保它确实使用了索引而不是去磁盘?它正在使用索引,但在那之后,它必须从磁盘读取记录。假设你没有足够的内存,可能就是这样。调整配置可能会有所帮助…我是否应该简单地将key_buffer参数提高到索引的大小之上?还是超过表和索引的大小之和?要考虑的另一个配置参数?尝试使用<代码> PACKYKEY=1 < /COD>内存中有较大的索引部分。实际上,我需要2个以上的列,不要以为我应该创建一个6列索引!
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------+
| id | select_type | table    | type | possible_keys | key        | key_len | ref   | rows | Extra |
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------+
|  1 | SIMPLE      | mytable  | ref  | parameters    | parameters | 3       | const | 1097 |       |
+----+-------------+----------+------+---------------+------------+---------+-------+------+-------+