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 优化的同行提供一些帮助。

PHP+MYSQL运用索引实现数十万级数据快速搜索》上有5条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.