Php 字符串大小是否影响MySQL中的select查询速度?

Php 字符串大小是否影响MySQL中的select查询速度?,php,mysql,database,string,Php,Mysql,Database,String,我目前正在设计数据库的结构。计划拥有一个包含数亿行的巨大表(我们称之为Clicks表)。它的许多列将在其他表中被外键引用,以减小这个巨大表的大小并减少查询时间 在那些其他的“参考表”中,我计划存储关于点击的大部分数据。因此,当我查找Clicks表时,我只需将这些参考表中的一些连接起来,就可以了解有关Clicks的信息 第一个问题:如果我以后要在这个巨大的点击量表上做很多选择,这是一个很好的速度练习吗 这些较小的引用表将有数千行,其中大部分是带有字符串类型的一列。这些字符串的长度将介于5-50个字

我目前正在设计数据库的结构。计划拥有一个包含数亿行的巨大表(我们称之为Clicks表)。它的许多列将在其他表中被外键引用,以减小这个巨大表的大小并减少查询时间

在那些其他的“参考表”中,我计划存储关于点击的大部分数据。因此,当我查找Clicks表时,我只需将这些参考表中的一些连接起来,就可以了解有关Clicks的信息

第一个问题:如果我以后要在这个巨大的点击量表上做很多选择,这是一个很好的速度练习吗

这些较小的引用表将有数千行,其中大部分是带有字符串类型的一列。这些字符串的长度将介于5-50个字符之间

我计划做的是,当单击时,我将检查这些小表是否已经存在相同的值,如果不存在,我将插入它们

这需要一个SELECT

第二个问题:对字符串本身执行搜索并为其编制索引是更好的做法,还是应该让另一列显示该字符串的MD5结果并查找MD5字符串(带索引)?换句话说,字符串的大小是否会影响在简单select中查找字符串的长度

我计划这样做:

SELECT id FROM table1 WHERE string = $string

有没有更好的方法来实现上述目标?

您的设计听起来不错。您希望在每个引用表中的字符串上都有一个辅助索引

您的描述不清楚您是一次“点击”还是批量“点击”

我建议使用批处理方法进行此操作,除非您迫切需要实时数据。如果您确实需要实时数据,我倾向于提倡“流式ish”方法,即通过插入现有表来添加新数据,而不使用更新


如果每天单独更新数百万行,则峰值处理期间的锁定操作可能会代价高昂。如果该表用于分析或报告,则该处理产生的查询负载也可能会干扰更新。

您的设计听起来不错。您希望在每个引用表中的字符串上都有一个辅助索引

您的描述不清楚您是一次“点击”还是批量“点击”

我建议使用批处理方法进行此操作,除非您迫切需要实时数据。如果您确实需要实时数据,我倾向于提倡“流式ish”方法,即通过插入现有表来添加新数据,而不使用更新


如果每天单独更新数百万行,则峰值处理期间的锁定操作可能会代价高昂。如果该表用于分析或报告,则该处理产生的查询负载也可能会干扰更新。

如果对这些数据进行散列,则散列本身可能会比正在散列的字符串长,这会适得其反。你会想要散列一些始终较大的东西,通常是一个数量级或更多。例如,7KB的JSON字符串就是一个很好的候选字符串。计算散列并在索引中查找散列比在索引中比较字符串要快

您需要做的是制作这个原型,用具有代表性的数据量填充它,并查看它的性能。您的数据库需要调整以处理您的工作负载,并且您的模式需要被执行到临界点,以便在您的方法崩溃之前知道您可以处理多少数据


也许突破点是1亿张唱片。也许是500亿。没有人知道它将如何在您的硬件上运行,只有您可以通过测试来了解。

如果您对这些字符串进行散列,那么散列本身很可能会比您正在散列的字符串长,这会适得其反。你会想要散列一些始终较大的东西,通常是一个数量级或更多。例如,7KB的JSON字符串就是一个很好的候选字符串。计算散列并在索引中查找散列比在索引中比较字符串要快

您需要做的是制作这个原型,用具有代表性的数据量填充它,并查看它的性能。您的数据库需要调整以处理您的工作负载,并且您的模式需要被执行到临界点,以便在您的方法崩溃之前知道您可以处理多少数据

也许突破点是1亿张唱片。也许是500亿。没有人知道它将如何在您的硬件上运行,只有您可以通过测试来了解