Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 blob列上的慢速查询分组_Mysql_Sql_Indexing_Query Optimization_Explain - Fatal编程技术网

Mysql blob列上的慢速查询分组

Mysql blob列上的慢速查询分组,mysql,sql,indexing,query-optimization,explain,Mysql,Sql,Indexing,Query Optimization,Explain,我使用以下查询从mediumblob列中提取频繁的短值: 选择字节,将(*)计数为n 从pr_值 如果字节不为空&&length(字节)选择字节,从pr_值中将(*)计算为n,如果字节不为空&&length(字节)描述pr_值; +-------------+---------------+------+-----+---------+-------+ |字段|类型|空|键|默认|额外| +-------------+---------------+------+-----+---------+

我使用以下查询从
mediumblob
列中提取频繁的短值:

选择字节,将(*)计数为n
从pr_值
如果字节不为空&&length(字节)选择字节,从pr_值中将(*)计算为n,如果字节不为空&&length(字节)描述pr_值;
+-------------+---------------+------+-----+---------+-------+
|字段|类型|空|键|默认|额外|
+-------------+---------------+------+-----+---------+-------+
|产品识别号int(11)| NO | PRI | NULL ||
|变量| id | int(11)| NO | PRI | NULL ||
|作者id | int(11)| NO | PRI | NULL ||
|字节| mediumblob | YES | MUL | NULL ||
+-------------+---------------+------+-----+---------+-------+
类型为mediumblob,因为大多数值都很大。只有不到10%的数据比我在这个特定查询中寻找的数据短

我有以下索引:

mysql>根据pr_值显示索引;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
|表|非唯一|键|名称|列|名称|排序规则|基数|子|部分|压缩|空|索引|类型|注释|索引|注释|
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
|pr|u值| 0 |主| 1 |产品| id | A | 8961 | NULL | NULL | BTREE ||
|pr|u值| 0 |主| 2 |变量| id | A | 842402 | NULL | NULL | BTREE ||
|pr|u值| 0 |主| 3 |作者| id | A | 842402 | NULL | NULL | BTREE ||
|pr|u值| 1 |字节| 1 |字节| A | 842402 | 10 |空|是| BTREE ||
|pr|u值| 1 |字节| 2 |变量| id | A | 842402 | NULL | NULL | BTREE ||
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
MySQL这样解释我的查询:


mysql>explain select bytes,从pr_值中将(*)计数为n,其中bytes不为null&&length(bytes)为什么要按blob列分组?我认为这是瓶颈所在,因为查询实际上会对所有blob列进行相互比较。是因为您希望BLOB具有唯一的值吗?我认为DISTINCT关键字的性能可能比groupby更好

您对(字节、变量_id)的索引不是很智能。如果查询中总是有一个variable_id子句,则应首先添加带有variable_id的索引:

(变量id,字节)

这取决于判别变量_id的大小。但这会有帮助的


另一个技巧是添加一个结果为“length(bytes)”的新索引列这应该是一个注释而不是答案。这是因为我想得到10个最常见的值。所以我按数字分组和排序。你看到其他方法吗?选择DISTINCT bytes LIMIT 10;group by关键字和DISTINCT关键字的行为略有不同。group by用于排序/求和。为了唯一性,DISTINCT执行更好,因为它会过滤加入后的结果。我不明白。您建议如何查询最频繁的10个值以及相关记录数?mySql中是否有计算列?您的索引建议似乎很好。我会带着评论回来(和/或upvote+accept)事实上,它在我的开发服务器上运行得很好(持续时间降至0.07s,这对我的应用程序来说是可以接受的),但在我的一台服务器上(windows)就不行了大约45秒,比没有索引的时间长。你知道这可能是什么原因吗?服务器参数?抱歉,我不知道为什么你的服务器行为不一样。你是否检查并解释了索引实际正在使用?是的。我怀疑这台服务器上有问题。因为你给了我一个重要提示(对索引中的列进行排序),我现在接受您的答案。谢谢并欢迎您这么做;)
update pr_value set small = length(bytes)<11;