分类目录归档:系统开发

PHP+MYSQL运用索引实现数十万级数据快速搜索

近期公司有个项目,是PHP+MYSQL搭建的。主表记录数大约是150万条左右。考虑到搜索引擎收录,做了专门针对SEO优化的,比如搜索山东+公司,关键字则是“山东,公司,山东公司”,标题同样是相关的。用户第一次搜索,则生成一条该关键字的记录,以后搜索直接在搜索次数加一。专门做了一个搜索关键字的sitemap来优化,搜索结果每页80条。

运营了一段时间,没有什么问题。最近发现很多关键字都是有几十万条记录,就拿五金这个词来说吧,有9万多条记录。点到1000页的时候,第80000条记录,查询时间竟然要10秒左右。汗~难怪有客户反映速度慢。。。。

想到了数据库优化。为某些字段(比如所在城市(int),所在地区省份(int),公司id (int)所属行业)建立索引,这样在企业目录中,即使到第8万条记录,时间也可以控制在一秒内。但是关键字查询速度还是没有解决。

现在的sql查询速度是”select `*` from `st_company` {where} order by `coid` asc”。

忽然想到了mysql中有个in,于是吧查询改成了”select `co_id` from `st_company` {where} order by `coid` asc”。然后把结果用php组合成”1,2,3,4,5,6″的字符串,在一次二次查询”select `*` from `st_company` where `co_id` in (1,2,3,4,5,6)”,速度一下提高了10倍左右。即使用户搜索(使用like查询没有索引的co_do的时侯)的时候,第8万条数据的时候,速度与不超过一秒。效果还不错~

上面用减少查询字段的方法,提高了速度,忽然想到略过前边的字段不是能更快的加快查询速度吗?mysql没有top,可以说是一个很大的遗憾,只能用limit,这样在优化肯定没有上边的速度快了。

忽然想到了百度那么多数据,后页是怎么处理的呢?比如查询“你好”,有44,700,000条记录。修改百度get提交中的pn为10000,晕,就到76页,及760条数据,用时0.001秒。再看Google,52,800,000 条查询结果,最多到788条记录,后边就没有了,不过Google的查询速度竟然用到了搜索用时 2.54 秒(Google.cn),不知道他们的数据库架构师在干什么?搜狗总共找到 266,212,429 个网页,返回1000条结果,最后一页(100页)用时 0.034 秒。搜搜据说是Google提供的技术支持,搜索到搜索到约9,300,000项结果,返回了74页,共738条结果,查询时间很抱歉,也要1.8秒左右。有道搜索到符合 你好 的结果约 6400万 条,看结果是是老大了,很可惜,只返回了50页,500条记录,用时0.156 秒。用时时间一官方网站上的查询时间为准。

实际搜索结果没有必要做那么多,通过比较,最终决定只返回1600条记录,20页。sql查询时间0.05-0.2秒左右,还可以接受。毕竟客户如果在前10页找不到需要的信息。很有可能更换关键词了。

在此给奉Google为上的网民们说一下,Google的技术不是最好的,最起码数据库架构方面做得很垃圾。以前我也一直认为Google是最棒的,但是结果呢?百度,做到全国第一,你当之无愧,不过我小看了你好久。

PHP+MYSQL运用索引实现数十万级数据快速搜索一文,希望同样给做tag 优化的同行提供一些帮助。

TENCENT协议的实现原理-通过自定义协议执行程序

通过Tencent://Message/可以打开QQ和朋友聊天,一直对他挺好奇?到底是什么原理?
今天,我在网上找了一下TENCENT协议的实现原理,还真找到了;文章请访问:http://hi.baidu.com/kmiaoer/blog/item/799fd388ec403691a5c2723b.html
原来是在注册表中修改的。
知道了原理就好办了,我们也来写一个

定义一个miaoqiyuan协议。实现什么功能的,哦,多了,miaoqiyuan:你好。这样来实现弹出对话框,弹出你好。

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\miaoqiyuan]
@="miaoqiyuan Protocol"
"URL Protocol"="D:\\miaoqiyuan\\miaoqiyuan.exe"
 
[HKEY_CLASSES_ROOT\Smiaoqiyuan\DefaultIcon]
@="D:\\miaoqiyuan\\miaoqiyuan.exe,0"
 
[HKEY_CLASSES_ROOT\miaoqiyuan\shell]
 
[HKEY_CLASSES_ROOT\miaoqiyuan\shell\open]
 
[HKEY_CLASSES_ROOT\miaoqiyuan\shell\open\command]
@=\"D:\\miaoqiyuan\\miaoqiyuan.exe\" %1"

这样,通过miaoqiyuan:链接的文件都可以通过miaoqiyuan.exe打开了

下面说说怎样来弹出对话框。

在VB中新建一个标准的EXE程序,新建一个按钮,改名为Showmsg,双击,输入END(点击退出程序)

然后添加

Private Sub Form_Load()
    showmsg.Caption = Replace(Command(), "miaoqiyuan:", "")
End Sub

这样就可以通过输入miaoqiyuan:1234弹出1234的警告了

这样就可用通过一个自定义的协议来执行程序了