快速搜索巨大的mysql数据库

时间:2013-05-16 17:46:29

标签: mysql database performance optimization

我需要索引一个巨大的mysql数据库(5亿条记录)。 我很少创建,更新或删除

只有一些请求,比如SELECT * FROM tbl_person WHERE name LIKE'foo%'

我已经在字段上设置了索引。

在阅读请求中获得最佳性能会更好

5billions记录表上的1个单一请求 或者在500万条记录表上提出10个请求并在之后加入结果。

2 个答案:

答案 0 :(得分:7)

你可以做很多事情。首先,如果您经常按人名搜索,请考虑按人名的前几个或前几个字母对表进行分区。请参阅Partitioning Types

例如,由于整数搜索的速度要快得多,因此您可以创建一个名为 name_abbr 的字段,该字段是 smallint ,表示人员的前2或3个字母。他们的名字。您将对此字段进行索引和分区!因此, aaa 为1, aab 为2,依此类推。您的查询看起来像这样:

SELECT * FROM Table WHERE name_abbr=123 AND name LIKE 'foo%';

现在,这将打到正确的分区,而LIKE只需检查更小的记录集。

您还可以做很多其他事情,但请记住,对于大型数据集,最好将数据分解为组,并始终尽可能使用整数进行查询。此外,请确保使用EXPLAIN关键字来确保您的查询使用了您希望它们使用的索引和分区。

答案 1 :(得分:2)

使用大小的MySQL数据库上的LIKE子句,你永远不会获得“好”的性能,因为不能可能不会使用索引。

如果您需要这样的高效查询,那么您应该考虑不同的存储设计。一种常见的方法是为字符串的每个长度分别设置索引列。

例如:

  1. foobar的
  2. fooba
  3. foob
  4. FOO
  5. FO
  6. ˚F
  7. 您将显着增加仓库中的数据,但您的要求将证明这是否是一个适当的权衡......是否比性能便宜?只有你知道答案。

    编辑:我现在看到问题的第二部分了。 你问是否最好对5b记录进行一次查询,或者对500m rec和UNION结果进行10次查询....

    我倾向于说你几乎肯定会在单个查询中获得更好的结果,除非你有一个有效的分片系统来分支查询....你将不得不测试它来验证您现有的基础设施。