Mysql 如何通过子字符串查询加快分组速度?
我有一个具有以下结构的表:Mysql 如何通过子字符串查询加快分组速度?,mysql,sql,group-by,substring,Mysql,Sql,Group By,Substring,我有一个具有以下结构的表: id bigNumber text 1 1200321030011010233 "an item with some text" 2 1200321030011014563 "another item with some more text" 3 3120323434432211133 "more...." . . . 该表包含大约50000条记录。我想执行以下查询,但速度很慢: SELECT COUNT(*), b
id bigNumber text
1 1200321030011010233 "an item with some text"
2 1200321030011014563 "another item with some more text"
3 3120323434432211133 "more...."
.
.
.
该表包含大约50000条记录。我想执行以下查询,但速度很慢:
SELECT COUNT(*),
bigNumber
FROM items
GROUP BY substr(bigNumber, 1, X)
其中X从2到19变化
创建19个列,每个列中都有数字的一部分,这样可以更快地使用索引吗?我认为您想要的结果是X%。但这不会使用索引
SELECT count(*) FROM items WHERE bignumber LIKE "_2%"
SELECT count(*) FROM items WHERE bignumber LIKE "_19%"
_表示一个字符
%表示任意数量的字符
有关详细信息,请参阅。您可以使用索引而无需添加任何列,只需在bigNumber列上创建索引即可:
create index bignum_index on items (bigNumber);
varchar上的索引(bigNumber是varchar,对吗?)可以用来查找任何字符串前缀
也就是说,您需要进行一次完整的表扫描来回答查询,因此索引对您没有多大帮助。我建议您不要使用19个单独的列,可能只有3或4个,就像这样:
alter table items
add column bignumber_l1 char(1)
, add column bignumber_l3 varchar(3)
, add column bignumber_l6 varchar(6);
update items
set bignumber_l1 = left(bignumber, 1)
, bignumber_l3 = left(bignumber, 3)
, bignumber_l6 = left(bignumber, 6);
alter table items
add index bignumber_l1
, add index bignumber_l3
, add index bignumber_l6;
然后,当您查询x长度的字符串时,请使用最长匹配项编写查询,但不要过长:
SELECT COUNT(*),
bigNumber
FROM items
GROUP BY bignumber_l3, substr(bigNumber, 1, 4)
此查询可以使用索引,可能会显著提高性能。请注意,由于您要的是整个表,mysql可能会决定您需要扫描表,甚至需要使用上面的索引,因此您可能需要使用。谢谢,但我需要使用GROUP BY方法。X从1到19不等,即我想根据bigNumber中的前X个数字对项目进行分组。我建议将big number的重要部分分开,然后使用order by。感谢大家令人难以置信的快速回答!!有人知道我是否可以用19列来代替这个吗?我知道这是一个肮脏的解决方案,但我目前唯一关心的是速度:)也许还有其他解决方案,而不是substr?澄清一下:我运行的实际查询有点不同,确实需要group by,因为我还请求基于group的一些COL的avg。再次感谢!只要您仍然需要完整的表扫描,向表中添加更多数据只会使查询速度变慢。因此,它是否“脏”并不重要——它根本不是一个解决方案。