【求助】Tag数据库设计--千万级的数据查询问题,建立了索引了还是慢,谢谢

adandelion 2009-07-28 05:36:41


--建表:
if object_id('Poesy','u') is not null
drop table Poesy
go


create table Poesy
(
id int identity(1,1),
Title varchar(100),
Tag varchar(100)
)
go
alter table Poesy add constraint pk_Posy primary key(Id)
go
--造数据
declare @Number int,@NumberTop int,@TagId int
Set @TagId = 1
Set @number = 1
Set @numberTop = 10000000

while @number<=@numberTop
begin
if @TagId = 100
Set @TagId = 1
INSERT Poesy(Title,Tag)
select 'title'+cast(@number as varchar), '历史'++cast(@TagId as varchar)+',铁木真,元朝历史,蒙古历史'+cast(@number as varchar)
Set @number = @number +1
Set @TagId = @TagId +1
end


--建立索引
create index Ix_poesyTag on Poesy(Tag)

--查询 很慢要一分钟以上(1)
with Orderlist as (
select row_number() over(order by id desc) as rownumber,id,title
from poesy
where charindex(',蒙古历史10000,',','+tag+',')>0
) select RowNumber,Id,Title
from Orderlist
where RowNumber between 1 and 50

--查询很快(2)
with Orderlist as (
select row_number() over(order by id desc) as rownumber,id,title
from poesy
where charindex(',元朝历史,',','+tag+',')>0
) select RowNumber,Id,Title
from Orderlist
where RowNumber between 1 and 50



查询1很慢,因为 tag里 包含 蒙古历史10000的记录只有一条。
查询2很快,因为tag里包括 元朝历史 的记录非常多

如何解决查询慢的问题??或者说tag数据库设计的问题。

谢谢
...全文
1396 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
king1234 2011-03-05
  • 打赏
  • 举报
回复
这也遇到这样的问题,但是打算用java 的Lucene搜索,并保存数据库关联id。抛弃数据库可能会更好些。。
adandelion 2009-09-08
  • 打赏
  • 举报
回复
一个多月了,请求置顶
xiequan2 2009-08-08
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 adandelion 的回复:]
没人帮忙吗?
[/Quote]

这么大的数据量,不是sqlserver能搞定的
adandelion 2009-08-08
  • 打赏
  • 举报
回复
没人帮忙吗?
tayachz 2009-08-02
  • 打赏
  • 举报
回复
帮顶
yonghanyang 2009-08-02
  • 打赏
  • 举报
回复
帮顶
soft_wsx 2009-08-02
  • 打赏
  • 举报
回复
没话说了,呵呵
adandelion 2009-08-01
  • 打赏
  • 举报
回复
ding
adandelion 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 mars58 的回复:]
如果你是千万级数据库的话建议你重新设计表,把记录分类后,按照分类将记录分区,这样你的查找时间至少可以少几个数量级
[/Quote]

有点道理,但是tag 是用户随时定义的份分类。。。N多。。。
Q315054403 2009-07-30
  • 打赏
  • 举报
回复
改为TOP写法
Tomzzu 2009-07-30
  • 打赏
  • 举报
回复
这样查肯定慢, 没有利用上索引
1. 要么根据需求改写成索引列查询的方式
2. 要么把 charindex的方式, 修改成 like 的方式 如

tag like '%蒙古历史10000%'
mars58 2009-07-30
  • 打赏
  • 举报
回复
如果你是千万级数据库的话建议你重新设计表,把记录分类后,按照分类将记录分区,这样你的查找时间至少可以少几个数量级
mars58 2009-07-30
  • 打赏
  • 举报
回复
如果是模糊查扎的话建议使用like,charindex需扫描整个索引,而like被优化器优化后并非完全扫描索引,你可以同时使用两种方案查看执行计划消耗的百分比
adandelion 2009-07-30
  • 打赏
  • 举报
回复
等待建设性意见,谢谢各位回答
超维电脑科技 2009-07-30
  • 打赏
  • 举报
回复
xuexi
rucypli 2009-07-29
  • 打赏
  • 举报
回复
逻辑上索引是B+树,
“元朝历史”在“'蒙古历史10000”的上一层
扫描索引的时候必然上一层比后一层快
sadson 2009-07-29
  • 打赏
  • 举报
回复
Tag最好别放一起,一个一个分开存,用charindex索引都是扫描的
adandelion 2009-07-29
  • 打赏
  • 举报
回复
(1)select top 10 poesyid,tagid from TestTagPoesy
where poesyid = 10000
耗时不到1秒钟

(2)select top 10 tagid,poesyid from TestTagPoesy
where tagid = 2
--耗时30秒

CTL+L 看了一下(2)是scan table ,而(1)却是 seek index

这两列都建立了索引了啊。。。
adandelion 2009-07-29
  • 打赏
  • 举报
回复
select top 10 tagid from TestTagPoesy
where tagid = 2
这样很快

select top 10 tagid ,poesyid from TestTagPoesy
where tagid = 2

这样要半分钟呢?

tagid ,poesyid 这两列都建立来的索引了啊。把两列位置换一下速度没有斌话,使用* 也没有变化

  • 打赏
  • 举报
回复
表存储结构设计的时候就应该考虑这样的问题。最好把表拆分一下。
加载更多回复(13)

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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