如何分割mySQL全文表?

cj3*_*333 2 mysql full-text-search

我有一个带有全文的mysql表.每天它的大小将增加30K数据项.我担心当数据大小增加到许多GB时,查询速度会降低.我的情况允许我将搜索限制为最近的一百万个数据项.

首先,我试过partitioning table,但MySQL不supprt fulltextpartition在同一时间.

http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations.html

有些朋友建议我使用其他DBMS产品,如sphinx,solroracle.但出于预算原因,我宁愿使用mySQL.(原谅我的固执).

那么,我该如何优化mysql全文表搜索?当数据量增加时,如何保持可接受的查询速度?

  1. 分桌?(然后使查询复杂)

  2. 只能通过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

  3. 另一个好建议?谢谢.

O. *_*nes 5

这是一种处理问题的方法.它不是超级漂亮,但它会非常有效.

创建表的两个副本.叫一个类似的东西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天).

这种将数据从当前表迁移到归档表的方法具有一些方便的功能.

  1. 这是安全的 - 大多数记录都在当前和归档表中.
  2. 这是确定性的 - 使用日期而不是ID可以让您精确选择要归档的项目.
  3. 如果您需要,它可以为您的产品提供缓慢但有效的"搜索档案"功能.
  4. 它使您当前数据表的大小相对可行,同时允许您使用mySql的精细全文搜索功能.
  5. 这是有效的 - 迁移的艰苦工作是每天一次完成,而不是通过查询中的ID号连续进行.

以下是当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)

看看这是怎么回事?当您进行归档和清除时,无论插入的时间长短,您总是根据插入的日期选择记录.这就是我所说的确定性.