我需要索引一个巨大的mysql数据库(5亿条记录)。 我很少创建,更新或删除
只有一些请求,比如SELECT * FROM tbl_person WHERE name LIKE'foo%'
我已经在字段上设置了索引。
在阅读请求中获得最佳性能会更好
5billions记录表上的1个单一请求 或者在500万条记录表上提出10个请求并在之后加入结果。
答案 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
子句,你永远不会获得“好”的性能,因为不能可能不会使用索引。
如果您需要这样的高效查询,那么您应该考虑不同的存储设计。一种常见的方法是为字符串的每个长度分别设置索引列。
例如:
您将显着增加仓库中的数据,但您的要求将证明这是否是一个适当的权衡......是否比性能便宜?只有你知道答案。
编辑:我现在看到问题的第二部分了。
你问是否最好对5b记录进行一次查询,或者对500m rec和UNION
结果进行10次查询....
我倾向于说你几乎肯定会在单个查询中获得更好的结果,除非你有一个有效的分片系统来分支查询....你将不得不测试它来验证您现有的基础设施。