二十万数据,如何查询?
发布网友
发布时间:2023-05-11 01:41
我来回答
共5个回答
热心网友
时间:2023-10-09 00:14
老弟,说句实话不想回答你,分少点。
-----------------------------------------------
第一:脱机浏览器数据库
你可以参照中国民航售票的做法,人家的那个点比你这个少。
例如:他们把数据放入了js 文件,加载的时候js就相当于文本数据库,当然也有人用sqllite做为脱机数据库,在脱机数据库方面可以深入。
先说js
他们 有这样的数据 {[北京西直门][北京-全国]}----这个文件密密麻麻放入20万的key-value的数据估计要在1M上下,使用雅虎工具压缩估计可以整到400K左右,可能更小。
-----------------------------------------------------------------------------------------------------------------------
第二:数据库实时方案
这个你可以使用异步请求,但是数据库可以开启大缓存,将表的数据最大化的放入内存。国内有内存数据库方面的权威,比如南大科技的数据库,中国南天的数据库都有内存数据库的方案。
你也可以使用oracle给你提供的内存数据库方案,都不差。
-----------------------------------------------------------------------------------------------------------------------
第三:程序缓存
这个比较实际,把表数据缓存起来,读写缓存就可以了,不用建立数据库连接,缓存一天过期一次。
--------------------------------------------------------------------------------------------------------------------
第四:程序适当放入规定,你也没必要完全模仿百度吧!换个心眼什么都解决了。
---------------------------------------------------------------------------------------------------------------------
第五:表结构的设计,使用稍微严谨的方案就可以了,
-------------------------------------------------------------------------------------------------------------------
总结:你这种东西想通过表结构设计或是查询来优化的空间有限,你如果实在想用实实在在的数据库也没有人阻拦你!
看如下一些人用的拼音码方案的部分代码:
Public Function PinYin(Tstr As String) As Long
Dim I As Long
I = Asc(Tstr)
If I >= Asc("啊") And I < Asc("芭") Then PinYin = 1
If I >= Asc("芭") And I < Asc("擦") Then PinYin = 2
If I >= Asc("擦") And I < Asc("搭") Then PinYin = 3
If I >= Asc("搭") And I < Asc("蛾") Then PinYin = 4
If I >= Asc("蛾") And I < Asc("发") Then PinYin = 5
If I >= Asc("发") And I < Asc("噶") Then PinYin = 6
If I >= Asc("噶") And I < Asc("哈") Then PinYin = 7
If I >= Asc("哈") And I < Asc("击") Then PinYin = 8
If I >= Asc("击") And I < Asc("喀") Then PinYin = 9
If I >= Asc("喀") And I < Asc("垃") Then PinYin = 10
If I >= Asc("垃") And I < Asc("妈") Then PinYin = 11
If I >= Asc("妈") And I < Asc("拿") Then PinYin = 12
If I >= Asc("拿") And I < Asc("哦") Then PinYin = 13
If I >= Asc("哦") And I < Asc("啪") Then PinYin = 14
If I >= Asc("啪") And I < Asc("欺") Then PinYin = 15
If I >= Asc("欺") And I < Asc("然") Then PinYin = 16
If I >= Asc("然") And I < Asc("撒") Then PinYin = 17
If I >= Asc("撒") And I < Asc("塌") Then PinYin = 18
If I >= Asc("塌") And I < Asc("挖") Then PinYin = 19
If I >= Asc("挖") And I < Asc("昔") Then PinYin = 20
If I >= Asc("昔") And I < Asc("压") Then PinYin = 21
If I >= Asc("压") And I < Asc("匝") Then PinYin = 22
If I >= Asc("匝") And I <= Asc("座") Then PinYin = 23
End Function
-------------------------------------------------------------------------
类型界定的方式必然可以缩小范围,这个也是一个策略。
热心网友
时间:2023-10-09 00:14
放在一张表中 我感觉如果没有大字段(也就是有占很多的空间的字段 如:Ntext型的)的话 应该没有问题 。 主要是在程序设计的时候要好好控制: 我的控制方法如下
在你加载这个页面的时候 你把所有的数据一次给查出来 放在本地(异步加载。可能第一次慢一点), 等你查询的时候 就直接匹配你本地的数据集合,不去访问数据库,这样能减少数据交互的时间了,就会很快的
热心网友
时间:2023-10-09 00:15
方案一.
单独设置一个 关键字表
20万的 站的信息, 应该有不少重复的.
关键字表 只有 1列 , 就是 站台名.
假如最后这个关键字表数量 不是很大, 那么可以考虑 缓存到服务器内存当中.
方案二.
假如 合并重复站名以后, 数据量还是很大.
那么
如果一个站台名称5个字,输入第一个字的时候,从20万条记录中模糊匹配一次
后面4个字,可以在客户端处理掉。
方案三.
修改查询算法
设置一个 已查询 缓存
例如, 当第一个用户输入 "人" "人民" "人民广" "人民广场" 都会有相应的结果
服务器上,缓存这 "人" "人民" "人民广" "人民广场" 的缓存信息
当第二个用户 输入 "人" "人民" "人民路" 的时候, 前2次的 查询结果, 缓存在结果列表中,不需要重新检索数据库
这个 “已查询 缓存” 需要有个 最大缓存条数, 以及一个 先进先出的算法。
注:
20万数据, 站名索引是必须的。
模糊匹配 尽可能避免 LIKE '%输入的字符%', 尽可能使用 LIKE '输入的字符%'
热心网友
时间:2023-10-09 00:15
20万条数据,你一定要有一个城市id的表,将20万个数据分别划分给每个城市,当有用户使用时,你先要让选择城市,这样就会将数据减到很少一部分,如果需要跨城市,就设置个区间,开始城市,目标城市.我觉得这样会快很多,只要带宽够.几百人操作不成问题
热心网友
时间:2023-10-09 00:16
我做过类似的,用拼音,可大大提高速度。你可以上网找找,获得一个汉字的拼音拼法,很多的。输入第一个字,就可以利用首字母缩小范围,输入第二个字在上面的基础上再利用首字母缩小范围...