提高在varchar字段中搜索的性能

时间:2012-09-18 10:21:53

标签: php mysql performance

对于来自搜索引擎的每次新访问,我保存访问者在搜索引擎中搜索的关键字(例如“php performance”)。

要计算关键字每天使用频率的数量,我需要检查其他人是否已经搜索了特定日期的字词。

几个月后,表变得非常大,并且mysql检查当天是否存在关键字需要更长时间。所以我切换到一个额外的表,我只保存关键字,并为每个关键字指定一个特定的ID,只有一次检查过程,而不是每个新的一天。这个特定的ID与我在表格中插入的关键字相关,每天都有多样化。

这已经更好了,但这张桌子也变得越来越大......

有人为此提供了更好的解决方案以获得更高的性能吗?

最佳,

弗雷迪

3 个答案:

答案 0 :(得分:1)

在性能方面,有一些'技巧'可以改进:

  1. 构建缓存机制。这就是你通过制作第二张桌子所做的事情。您可以更进一步,将缓存的表保留在内存或memcached中。
  2. 优化您的查询,并确保搜索字段中包含索引。如果你这样做,那就不舒服了。
  3. 尝试(de)规范化您的数据库。有时,不同的数据库结构从设计点来看并不是最优的,而是针对速度进行了优化。不确定你是否这样做。
  4. 查看不同的搜索解决方案,或许查看Lucene

答案 1 :(得分:0)

请勿将用户键入的所有关键字保存到DB。创建一个包含列的表:keyword,counter

每次访问者输入关键字时,您都会搜索数据库中的关键字并增加计数器,如果关键字不存在,则创建一个计数器= 1的新关键字。

同时在关键字列上使用索引并且不要使用FULLTEXT搜索,使用直接比较:

SELECT counter FROM keyword_table WHERE keyword="exact keyword" LIMIT 1;

答案 2 :(得分:0)

我个人不会使用MySQL作为这些数据的主要后备存储,我会寻找更快,更高可用的NoSQL解决方案,也许使用MySQL作为备份存储......

使用APC有内置的互斥锁,我不认为你的号码会被破坏,如果你启动并运行apc并且不满意它的数量,你需要直接访问Mutex以便不服务进程可能与另一个进程同时写入,Mutex在我的pthreads项目中提供,可以找到https://github.com/krakjoe/pthreads,需要更多的帮助随时问...