MySQL 性能 - 100 万条记录 - 在文本字段之前选择 Int

Jav*_*men 0 mysql sql database select mysqli

显然,在 100 万条记录中选择一个文本字段会很慢,不推荐。这里有两种可能的解决方案。

  1. 拆分数据库,为每个用户提供自己的数据库或表,从而显着减少每个表中的总记录。

  2. 执行 SQL SELECT 查询以匹配一个 INT,其中 INT 是用户 ID,然后匹配文本字段。

选项 1 将提供明显的性能提升。但选项 2 也会带来收益吗?在语句中,如果我们首先匹配 INT,这是否会将结果集缩小到仅匹配的记录,然后执行文本字段搜索。例如..

$user_id = 1001;
$domain_name = "mydomain.com";
$query = $database->prepare("SELECT * FROM domains_table WHERE user_id = $user_id && domain_name = $domain_name");
Run Code Online (Sandbox Code Playgroud)

在上述查询中切换 user_id 和 domain_name 的位置会破坏性能。首先匹配 user_id 在这里是否有优势?

O. *_*nes 5

一个百万行的表并不是很大。严重地。

如果您在userdomain字段上创建复合索引,则您在问题中显示的查询将相当有效,而无需对使用整数标识符进行任何更改。

当然,如果您不必运行额外的查询来找出它们的值,整数标识符的效率会更高一些。

您花在阅读有关 MySQL 中索引和查询执行计划如何工作的时间将是值得的。

您的第一个选项(为单独的用户使用单独的表)比正确索引单个表要糟糕得多。这有很多原因,但其中最主要的原因是,如果您开始拥有数千名用户,它就无法正常扩展。


Bil*_*win 5

你一直说事情是“显而易见的”。您是否测量过它们进行比较,或者您是否在做出假设?

使用索引可以非常快速地搜索字符串。如果没有索引,肯定比搜索整数快得多。

使用索引后,整数搜索和字符串搜索之间的区别几乎无法察觉。

最好的索引是列上的复合索引:

ALTER TABLE domains_table ADD INDEX (user_id, domain_name);
Run Code Online (Sandbox Code Playgroud)

想想电话簿。本书按姓氏排序,然后按名字排序。如果您搜索“Smith, John”,您可以轻松地将搜索范围缩小到所有 Smiths,然后在该子集中,姓名按名字排序,因此您可以轻松搜索所有名为 John 的人。这就是复合索引的工作原理。

如果您没有索引,就像从头到尾搜索整个电话簿一样。这称为表扫描,它变得越来越昂贵,与表的大小成正比。表的大小也会使索引查找变慢,但这次它的成本增加与表大小的对数成正比。

在其他评论中,您了解到优化器可以重新排序 WHERE 子句中的术语,以匹配索引中列的顺序。这是真的。这是查询优化器的工作,您可能使用的所有 RDBMS 产品(包括 MySQL)都足够智能来执行此操作。

您可能喜欢阅读我的演示文稿如何设计索引,真的。或者我做这个演讲的视频:https : //www.youtube.com/watch?v=ELR7-RdU9XU

还有一个很棒的网站,里面有很多关于索引的技巧:使用索引,卢克