有一个表,主要字段如下:
(也许会有一个名为ID的整型的唯一标识符)
NewsName nvarchar 新闻名
ClickTimes int 点击次数
InsertTime datatime 发布时间用户可以按新闻名进行查询,查询出来的数据,先按点击次数排(倒序),如果点击次数相同的,再按时间排(倒序)表中有百万级的数量,虽然建有索引,但大多数情况下的查询都是对新闻名称的模糊搜索NewsName like '%xxx%',索引一点也用不上。请教在这样情况下有什么办法可以进行优化?
(也许会有一个名为ID的整型的唯一标识符)
NewsName nvarchar 新闻名
ClickTimes int 点击次数
InsertTime datatime 发布时间用户可以按新闻名进行查询,查询出来的数据,先按点击次数排(倒序),如果点击次数相同的,再按时间排(倒序)表中有百万级的数量,虽然建有索引,但大多数情况下的查询都是对新闻名称的模糊搜索NewsName like '%xxx%',索引一点也用不上。请教在这样情况下有什么办法可以进行优化?
2\建立全文索引看看
1. 使用的是2000
2. 全文索引的查询结果听说不如人意呢.
自己开发时可以用用盗版什么的,难道数据库服务器上也用盗版?使用oracle的话,是否操作系统使用linux更合适?这样以来技术人员也要相应调整,成本太高了。其实现在只想用成本最低的方案解决现在经常出现的死锁现象。
我目前对这种烂事的办法是:
相关排序索引建好后,前台用户采用分页显示,数据库采用分页查询,就是说假如设定一页10条,当前台用户看第一页时,数据库只查询top 10条给前台,当用户看第二页时,
数据库只查top 20并只把最后10条给前台,这样基本可以保证前几页的查询速度
不过目前的数据库是不能这么处理了,因为会伤筋动骨的
全文索引我也试过,速度很不令人满意,最后只能放弃,我这种方式实际上是通过top N 的方式避免全表扫描,令数据库在找到前N条时,就停止查询,不过我这种方式也是有问题的,如果符合条件的记录很少,凑不够一页,或符合条件的记录都在数据堆的尾端,那也是要花大量的时间的做全表搜索的,我的感觉是,七成的搜索能在几秒之内收敛,剩下的就没准了.
?
那是因为你把分页和模糊搜索放在一起了,把它们分开,先搜索出来再做分页,
全文索引我也试过,速度很不令人满意,最后只能放弃,我这种方式实际上是通过top N 的方式避免全表扫描,令数据库在找到前N条时,就停止查询,不过我这种方式也是有问题的,如果符合条件的记录很少,凑不够一页,或符合条件的记录都在数据堆的尾端,那也是要花大量的时间的做全表搜索的,我的感觉是,七成的搜索能在几秒之内收敛,剩下的就没准了.
============================
请问能不能详细说一下你的做法?
///
insert into #temp
select top n *
from news_info where NewsName like '%'+@serach+'%' order by clickTimes desc ,insertTimes desc ------(clicktimes与inserttimes建好相应的复合索引)
///
---(其中///夹起来的部分需要拼成字符串然后用exec(@variable) 方式执行,因为top N不支持变量,2005就没这个问题了)
之后你的#temp中只会有几十条数据,按预定排序规则用分页算法对这个#temp分页,把最后一页给前台
是不是就是说把查询出的数据写入到临时表里面去。可是第一次查询时速度仍然很慢,是不是?
你说是使用top N的方式避免全表扫描,可是后面的查询条件中使用了like '%XXX%',这时已经进行全表扫描了啊。
效率可以保障。
select top 1 * from tablename where name like @s
和
select * from tablename where name like @s
效果是完全不一样的,因为第一句避免了全表扫描
因为微软的中文分词很差劲,所以尽量不用SQL的全文检索。网络上现在有不少类似的搜索,lucene(java版本,dotlucene是dot net版本)就是其中之一
?
晕,在数据库的全文索引其实也就是分词后的倒排索引方式。
因为微软的中文分词很差劲,所以尽量不用SQL的全文检索。网络上现在有不少类似的搜索,lucene(java版本,dotlucene是dot net版本)就是其中之一
===================================
先谢过这位兄弟。lucene我刚知道不久,正在了解。问题是目前的网站版本是ASP的,可以直接使用吗?难道真的要使用web service啊,郁闷。
建议很好