mysql - 如何告诉 MySQL 使用更多索引

标签 mysql indexing

我的 MySQL 查询遇到问题,据我看来,该查询太慢,因为索引无法正常工作。

我有一个表,其中包含 7 个可索引字段和 3 个数据 blob。

CREATE TABLE IF NOT EXISTS `superstrat` (
  `idStrategy` int(11) NOT NULL AUTO_INCREMENT,
  `strategy_date` datetime NOT NULL,
  `strategy_type` int(11) NOT NULL,
  `strategy_supertype` int(11) NOT NULL,
  `strategy_codes` varchar(40) NOT NULL,
  `strategy_vols` blob NOT NULL,
  `strategy_prices` blob NOT NULL,
  `strategy_hedge` blob NOT NULL,
  `strategy_neutrality` int(11) NOT NULL,
  `strategy_valuation_model` int(11) NOT NULL,
  `strategy_source` int(11) NOT NULL,
  PRIMARY KEY (`idStrategy`),
  UNIQUE KEY `strategy_date` (`strategy_date`,`strategy_type`,`strategy_supertype`,`strategy_codes`,`strategy_neutrality`,`strategy_valuation_model`,`strategy_source`),
  KEY `strategy_date_2` (`strategy_date`),
  KEY `strategy_type` (`strategy_type`),
  KEY `strategy_supertype` (`strategy_supertype`),
  KEY `strategy_codes` (`strategy_codes`),
  KEY `strategy_neutrality` (`strategy_neutrality`),
  KEY `strategy_valuation_model` (`strategy_valuation_model`),
  KEY `strategy_source` (`strategy_source`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=888605 ;

我执行了这个查询,但速度太慢

SELECT * FROM test_ter.superstrat WHERE strategy_date >= '2004-01-01' AND strategy_type='0'
AND strategy_supertype = '0' AND strategy_valuation_model='6'
AND strategy_source ='0' AND strategy_codes='10;' AND strategy_neutrality='2' LIMIT 0,5000;

原因是它仅对两个索引执行index_merge查询:strategy_type、strategy_codes:

1   SIMPLE  superstrat  index_merge strategy_date,strategy_date_2,strategy_type,strategy_supertype,strategy_codes,strategy_neutrality,strategy_valuation_model,strategy_source  strategy_type,strategy_codes    4,42        6258    Using intersect(strategy_type,strategy_codes); Using where

如何强制对其他字段进行索引合并,这里它将提取 6258 行而不是 1.5k,当我的数据库已满时,提取 50000 行将需要 60 秒,但我很确定它可以减少到目标1.5k,我只是不知道如何。 USE INDEX 和 FORCE INDEX 似乎不起作用。

最佳答案

查询速度慢的原因是索引太多。

当一条数据插入到mysql表中时,它会被写入硬盘上的一个文件中。 与生活和计算机中的一切一样,在较小的文件中查找相关数据比在较大的文件中查找相关数据更容易 - 因此,索引。 索引写入单独的物理文件中,索引文件的要点是它比数据文件小,因此 - 在索引文件中查找某些内容更快,一旦找到它,它就会告诉您记录在数据文件中的位置是。

当您现在查看表格时,您会注意到如何对每个可能的列建立索引,这很糟糕。您需要清楚地思考如何帮助计算机帮助您。

现在,当选择性为 100% 时,索引就是“最佳”。这意味着,如果您有 100 条记录并且对“idStrategy”列建立了索引 - 您将拥有 100 个不同的索引值。因此,不同索引 VALUES 的数量除以行数 = 选择性(说白了)。

那么,这里的问题是,使用哪一列可以最有效地筛选出数据集? 第一个浮现在脑海中的是strategy_date列。它被定义为唯一键,它的类型是日期时间,因此它在内部保存为 4 字节整数,这使其成为 BETWEEN 类型搜索的完美候选者,并且当从数据集中选择某些内容时,该列将产生最大的差异。

其他列,例如strategy_neutrality等不能有很多不同的值,因此它们对于索引来说不是很好的选择,因此 - 您不必为它们建立索引。

这里有很多东西要添加,但是我写的内容至少应该让您了解如何通过谷歌搜索不清楚的内容。希望对您有所帮助。

关于mysql - 如何告诉 MySQL 使用更多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261130/

相关文章:

php - sql 查询和 php 脚本来显示每天的平均问题

ruby - 索引超出字符串, ruby

javascript - 为什么不总是使用索引作为 vue.js for 循环中的键?

mysql - 一篇MySQL Explain解读及提升查询响应时间的建议

mysql - MySQL 中返回表的用户定义函数

mysql - 考虑到两列,如何做一个 LIKE?

python - Pandas 从 Int64Index 转换为 RangeIndex

mysql - 在 MySQL 中查找/替换

postgresql - idx_scan 统计信息是否自动重置(默认)?

string - 如何使用 MATLAB 计算拼字游戏中的单词分数