【发布时间】:2020-08-04 20:49:28
【问题描述】:
我试图了解 MySQL 中的索引以及它们如何工作以及它们在多大程度上提高了速度。我制作了一个包含 10 亿行的表,其中有一个名为“index_this”的列,其中包含 10 个可能的字符串值,大致均匀分布(因此每个值都在大约 1 亿行中找到)。这是我正在运行的查询。
SELECT COUNT(*) FROM mydatabase.mytable WHERE mytable.index_this = ‘A1ndxstring’;
运行此查询需要 30 秒,“index_this”列上有一个 BTREE 索引。我检查了查询优化器是否正在使用索引。
EXPLAIN SELECT COUNT(*) FROM mydatabase.mytable WHERE mytable.index_this = ‘A1ndxstring’;
返回
id 1
select_type SIMPLE
table mytable
type ref
possible_keys index_this
key index_this
key_len 43
ref const
rows 188130384
Extra Using where; Using index
这是我创建索引的方式。
CREATE INDEX myindex ON mydatabase.mytable (index_this);
我没有指定前缀长度,但之前我确实尝试过使用 2 前缀长度,这使得查询花费了将近 100 倍的时间。 30 秒对于这个表大小和这个查询是否合理,即使有索引?我正在寻找有关如何提高速度的任何建议。提前致谢。
【问题讨论】:
-
这是正确的索引。但是值很少,所以仍然需要计算大约 1 亿行。扔一些硬件怎么样?
-
您需要的数字有多准确?
EXPLAIN输出是否足够?使用persistent stats 得到更好的估计吗? -
创建一个汇总表以保持运行总计,并为存储过程在每次插入时更新触发器,然后针对汇总表运行查询。
-
30 秒对于那个音量来说已经相当不错了。
-
拥有一个包含 10 亿个条目的表主要是由于糟糕的数据库设计
标签: mysql sql group-by query-optimization