作者zhman (闲闲的人)
看板Database
标题Re: [SQL ] 如何改善 LIKE '%search%' 的效能?
时间Mon Jun 25 15:00:54 2007
※ 引述《statue (statue)》之铭言:
: ※ 引述《zhman (闲闲的人)》之铭言:
: : MySQL的全文检索我想并不适合用,尤其是中文的资料,虽然网页上是讲得很好听,不过试了就知道.
: : 如果你的资料是有特别的结构或pattern,那也许有其他更好的方法.
: : 我这里提供一个简单的一般化方法,就是自己实作index,透过cache的方式.
: : 1.开一个新的table,包含2个栏位:(key,id),key就是会被查询的keyword,id则是对应record的primary key.
: : 2.每次查询就先查这个table,有资料,那很幸运,你很快就有结果了.
: : 3.没资料,就重做你原来的like查询,再把结果insert到这个table中,下次就可以用.
: 这个其实有做了, 不过大家乱打的机率很大,
: 所以其实重复 match 查询字串的机率小的可怜..
: : 基本假设是你只想知道某个keyword是存在某笔record.其他更详细的查询,则需再做其他的变化.
: : 如果你有一些keywords,那可以预先insert一些资料,也可以增加效率.
: : 一旦资料有做更新时,也需要一并keyword的table,如果更新频繁的话,那你可要考量一下时间成本.
: 这边有点太高深了, 看不太懂....
: fulltext 其实我有试过, 但是我做了 FULLTEXT 後, 他显示的组别只有一组...
: 所以不管怎麽查的结果都是空的...
: 而这个查询在我的网站上平均会消耗 1-2 秒的时间, 其他的查询都能利用 index ..
: 对中文的查询该怎麽做才能加速呢..
我想先说的是,要时间就要用空间来换.
而你的查询平均只用了1-2秒,我以为以一般使用来说不算长了.
在资料库版,所以只探讨资料库能做的事.
以你的实例,命中率过低,以这个方法来说,你能做的就是我所说的,预先insert一些keywords.
资料库能加速,靠的就是预先准备好资料让你读,也就是index的功能.
如果都没有准备好,是不会平白无故变快的.你准备的资料不够,所以命中率会低.
而你的这种查询,一般化的资料库是没办法做index的.
就你前面的例子来说,"怒气药水",请问你的user有人会查"气药"吗?
如果不会,那你可以分析一下,对你的资料内容来说,
怎样的文字才会是一个keyword,怎样的不会.
如果你可以掌握你的keyword是什麽样子,就应该预先把符合pattern的keyword放进资料库.
也许会耗费许多空间,但如果增加的效率你觉得值得,那就值得.
(一般我们会把pattern弄得宽松一点,
使得不浪费太多空间,又能增加更多可能合理的关键字)
当然,你也可以把所有的文字组合都放进去XD.
MySQL的fulltext,我没看过原始码,不过以我的经验,它应该不是精确的搜寻方式,
所以你会有一些东西查不出来,感觉上有点半调子.
尤其对中文来说,根本搞不清楚它的索引逻辑,所以我不建议使用.
那就只能靠自己用其他方法来完成罗.
如果很计较速度,其实就不该依赖一般化的资料库,而是自己规划档案结构,自己存取档案.
资料库只是易於使用,可没说会比较快呀.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.60.106.5