cj3*_*333 2 mysql full-text-search
我有一个带有全文的mysql表.每天它的大小将增加30K数据项.我担心当数据大小增加到许多GB时,查询速度会降低.我的情况允许我将搜索限制为最近的一百万个数据项.
首先,我试过partitioning table,但MySQL不supprt fulltext并partition在同一时间.
http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations.html
有些朋友建议我使用其他DBMS产品,如sphinx,solr或oracle.但出于预算原因,我宁愿使用mySQL.(原谅我的固执).
那么,我该如何优化mysql全文表搜索?当数据量增加时,如何保持可接受的查询速度?
分桌?(然后使查询复杂)
只能通过id限制查询? SELECT * FROM table WHERE (MATCH (some_field) AGAINST ('+search_words' IN BOOLEAN MODE)) AND id>last_id-1000000 AND id<last_id Order By date DESC
另一个好建议?谢谢.
这是一种处理问题的方法.它不是超级漂亮,但它会非常有效.
创建表的两个副本.叫一个类似的东西text_current,第二个类似的东西text_archive.
将新到达的数据行加载到text_current.这样您的当前数据将可用于搜索.
编写两个存储过程:一个称为类似的东西copy_text从中选择较旧的行text_current并将其插入text_archive,另一个称为类似的东西purge_text从中删除较旧的行text_current.然后,从mySql作业运行这两个存储过程.
如果我是你,我会在copy_text每晚03:00 运行一次工作,并复制前一天(午夜到午夜)任何时间到达的每件物品.
我会purge_text每周运行一次这个 工作,并清除所有text_current超过35天的东西.(每天30K记录获得一百万条记录需要33.3天).
这种将数据从当前表迁移到归档表的方法具有一些方便的功能.
以下是当record_date列为unix时间戳时按日期选择记录的方法.如果您在任何一天运行此操作,它将从前一天的午夜选择记录,最多但不包括当天午夜的记录.
...
WHERE text_current.record_date >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY))
AND text_current.record_date < UNIX_TIMESTAMP(CURDATE())
...
Run Code Online (Sandbox Code Playgroud)
运行此查询的时间无关紧要,它始终在午夜到午夜运行.这就是它的美丽CURDATE()- 它意味着今天的午夜.(NOW()意思是,现在;它就像是CURDATE()但也有时间.但是你不想那样,因为你想要在午夜到午夜进行归档.如果你使用了NOW()你,你会在你跑的时候被小的不可预测性抓住你的存储过程.
(不要试图将BETWEEN操作符用于时间范围;它是包含的,并且您希望时间范围的结束时间不包括在内.)
同样,如果要删除超过35天的所有内容,请执行此操作.
DELETE
FROM text_current
WHERE text_current.record_date < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 35 DAY))
Run Code Online (Sandbox Code Playgroud)
看看这是怎么回事?当您进行归档和清除时,无论插入的时间长短,您总是根据插入的日期选择记录.这就是我所说的确定性.
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |