2

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

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

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

使用一个会更好地获得读取请求的最佳性能

对 50 亿条记录表的 1 个单个请求或对 5 亿条记录表的 10 个请求,然后加入结果。

4

2 回答 2

8

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

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

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

现在,这将命中正确的分区,LIKE 只需要检查一个小得多的记录集。

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

于 2013-05-16T18:09:05.813 回答
2

在 MySQL db 上使用该LIKE子句永远不会获得“良好”的性能,因为它不能不使用索引。

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

例如:

  1. 富吧
  2. 富巴
  3. 傻瓜
  4. F

您将显着增加仓库中的数据,但您的需求将证明这是否是一个适当的权衡……空间是否比性能便宜?只有你知道答案。

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

我倾向于说,除非您有一个有效的分片系统来分支查询,否则您几乎肯定会通过单个查询获得更好的结果……您将不得不对其进行测试以在现有基础架构上进行验证.

于 2013-05-16T17:49:54.923 回答