Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

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 如何通过子字符串查询加快分组速度?_Mysql_Sql_Group By_Substring - Fatal编程技术网

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。再次感谢!只要您仍然需要完整的表扫描,向表中添加更多数据只会使查询速度变慢。因此,它是否“脏”并不重要——它根本不是一个解决方案。