含有blob字段的表查询特别慢,怎么优化SQL?

shorsun 2010-03-01 01:46:46
数据库:mysql 5.0
首先说明,数据表的结构已经不允许调整了。

表中一共十来个字段,其中有一个是longblob类型的,现在发现,如果这个表的longblob类型存储的数据很多的话,则对这个表的查询就特别慢,即使不查询longblob字段也是如此。

尝试过给需要的字段添加索引,但是效果不是很明显,请问,再数据库结构不能调整的情况下,能否通过优化SQL的方式提高查询速度。

Table: recv_file

Field | Type | pri
---------------------------------
id | int | pri
name | varchar |
time | datetime |
data | longblob |

第一句:select id,name,time from recv_file /*这句很慢,如何优化*/
第二句:select id from recv_file /*这句比较快*/

给 name,time 都添加索引(普通索引 index)后,第一句速度有改善,但仍很慢。
如果把 data 字段中的数据都清空的话,速度就很快了。

请问有没有人能给出个好的优化建议。不允许调整表结构。
...全文
2326 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lary_li 2012-07-04
  • 打赏
  • 举报
回复
围观想知道结果
shorsun 2010-03-08
  • 打赏
  • 举报
回复
引用 6 楼 flairsky 的回复:
longblob太长,导致扫描的页面过多且无效。

建议拆成两个表,拼成视图,视图名与你原来表名一样,这样后面的结构都不用变

了解?

了解你的意思,通过视图可以进行查询,但是插入时就没法搞定了,除非分两次插入数据。问题在于该表是一个规范,多个协作单位都需要使用该表,不能根据我们的要求而影响其它单位开发的程序,汗一个!
不过你的这个回复让我想到或许能通过导数据的方式解决这个问题,就是当发现该表有数据时,将新增的数据排除掉blob字段后同步到另一个表中。不过貌似比较复杂。另外,如果能通过视图排除该字段也行,这个还没有试过,估计效率也不高,下午试一下。
shorsun 2010-03-08
  • 打赏
  • 举报
回复
引用 5 楼 leebin1986 的回复:
如果data字段前面N个字节(MyISAM:N <1000,InnoDB:N <767)重复率不高的话试试对data字段添加前缀索引

这个字段存放的是文件,数据内容不能保证都有些什么。
shorsun 2010-03-08
  • 打赏
  • 举报
回复
添加索引可以解决问题,以前添加索引后效率不高原因是where子句中有like查询。

结帖给分。
shorsun 2010-03-08
  • 打赏
  • 举报
回复
引用 12 楼 flairsky 的回复:
很简单啊,你一张表导入id,XX,XX,另一张表导入id,blob,两表通过id关联形成视图就行了

A表(id,XX,XX)
B表(id,blob)
视图V(id,xx,xx,blob)
直接用insert into V(id,xx,xx,blob)插入数据时会失败。
另外,由于该表结构已经提供给了其它单位,所以要保证其它单位使用时不会出错,所以放弃了这种做法。
flairsky 2010-03-08
  • 打赏
  • 举报
回复
引用 9 楼 shorsun 的回复:
引用 6 楼 flairsky 的回复:
longblob太长,导致扫描的页面过多且无效。

建议拆成两个表,拼成视图,视图名与你原来表名一样,这样后面的结构都不用变

了解?
了解你的意思,通过视图可以进行查询,但是插入时就没法搞定了,除非分两次插入数据。问题在于该表是一个规范,多个协作单位都需要使用该表,不能根据我们的要求而影响其它单位开发的程序,汗一个!
不过你的这个回复让我想到或许能通过导数据的方式解决这个问题,就是当发现该表有数据时,将新增的数据排除掉blob字段后同步到另一个表中。不过貌似比较复杂。另外,如果能通过视图排除该字段也行,这个还没有试过,估计效率也不高,下午试一下。


很简单啊,你一张表导入id,XX,XX,另一张表导入id,blob,两表通过id关联形成视图就行了
shorsun 2010-03-08
  • 打赏
  • 举报
回复
引用 10 楼 acmain_chm 的回复:
#1楼 不是让你再建一个索引了吗?

我在主帖中说的有:“给 name,time 都添加索引(普通索引 index)后,第一句速度有改善,但仍很慢。”
添加过索引,有一定改善,但仍不是很理想。
ACMAIN_CHM 2010-03-08
  • 打赏
  • 举报
回复
#1楼 不是让你再建一个索引了吗?
懒得去死 2010-03-06
  • 打赏
  • 举报
回复
换更好的磁盘吧。哈哈。
flairsky 2010-03-05
  • 打赏
  • 举报
回复
longblob太长,导致扫描的页面过多且无效。

建议拆成两个表,拼成视图,视图名与你原来表名一样,这样后面的结构都不用变

了解?
leebin1986 2010-03-02
  • 打赏
  • 举报
回复
如果data字段前面N个字节(MyISAM:N<1000,InnoDB:N<767)重复率不高的话试试对data字段添加前缀索引
Tong_SL 2010-03-01
  • 打赏
  • 举报
回复
本人新手为了下载一个东西,请指教!
shorsun 2010-03-01
  • 打赏
  • 举报
回复
引用 2 楼 yueliangdao0608 的回复:
对比下你这个字段存放数据的实际长度跟设定的长度,看看一致不?

longblob字段没有长度的设置吧。
懒得去死 2010-03-01
  • 打赏
  • 举报
回复
对比下你这个字段存放数据的实际长度跟设定的长度,看看一致不?
ACMAIN_CHM 2010-03-01
  • 打赏
  • 举报
回复
没有什么特别好的办法。不过如果只是针对你的第一句的话。如果你创建一个索引,则速度会比较快。
第一句:select id,name,time from recv_file /*这句很慢,如何优化*/
create index xxxx on recv_file(id,name,time)

表中如果数据多,这种什么WHERE条件都没有的自然会进行全表扫描。索引主要是用于优化 where 这种条件查询。

57,063

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧