Php mySQL更新文本vs INT字段类型(速度性能)
我需要在mySQL表中更新一个不确定的随机int/float数(最多32个) 在PHP中,我将它们放在一个数组中:Php mySQL更新文本vs INT字段类型(速度性能),php,mysql,Php,Mysql,我需要在mySQL表中更新一个不确定的随机int/float数(最多32个) 在PHP中,我将它们放在一个数组中: $array['numbers'][1]=5.5; $array['numbers'][2]=2; $array['numbers'][3]=43; (...) +----+-----------------------------------+ | id | numbers(Text) | +----+------------------
$array['numbers'][1]=5.5;
$array['numbers'][2]=2;
$array['numbers'][3]=43;
(...)
+----+-----------------------------------+
| id | numbers(Text) |
+----+-----------------------------------+
| 1 | a:3:{i:1;d:5.5;i:2;i:2;i:3;i:43;} |
+----+-----------------------------------+
+----+------------+------------+------------+---
| id | no1(int) | no2(int) | no3(int) |
+----+------------+------------+------------+---
| 1 | 5.5 | 2 | 43 |
+----+------------+------------+------------+---
mySQL场景1:
$array['numbers'][1]=5.5;
$array['numbers'][2]=2;
$array['numbers'][3]=43;
(...)
+----+-----------------------------------+
| id | numbers(Text) |
+----+-----------------------------------+
| 1 | a:3:{i:1;d:5.5;i:2;i:2;i:3;i:43;} |
+----+-----------------------------------+
+----+------------+------------+------------+---
| id | no1(int) | no2(int) | no3(int) |
+----+------------+------------+------------+---
| 1 | 5.5 | 2 | 43 |
+----+------------+------------+------------+---
mySQL场景2:
$array['numbers'][1]=5.5;
$array['numbers'][2]=2;
$array['numbers'][3]=43;
(...)
+----+-----------------------------------+
| id | numbers(Text) |
+----+-----------------------------------+
| 1 | a:3:{i:1;d:5.5;i:2;i:2;i:3;i:43;} |
+----+-----------------------------------+
+----+------------+------------+------------+---
| id | no1(int) | no2(int) | no3(int) |
+----+------------+------------+------------+---
| 1 | 5.5 | 2 | 43 |
+----+------------+------------+------------+---
要在这两种情况下更新这些字段,我知道id(它是INT auto_increment),因此我将包括其中的id=$known_id
如果我序列化它们并更新场景1,在更新速度方面会有什么不同吗?或者场景2的速度是否明显更快请记住,它可能是12、13、14或更多字段
注意:我也可以用空格分隔这些元素,并使用impolde()/explode(),但问题仍然是一样的。此外,我专注于更新,这意味着我不寻求速度性能的选择,等等
编辑:
$array['numbers'][1]=5.5;
$array['numbers'][2]=2;
$array['numbers'][3]=43;
(...)
+----+-----------------------------------+
| id | numbers(Text) |
+----+-----------------------------------+
| 1 | a:3:{i:1;d:5.5;i:2;i:2;i:3;i:43;} |
+----+-----------------------------------+
+----+------------+------------+------------+---
| id | no1(int) | no2(int) | no3(int) |
+----+------------+------------+------------+---
| 1 | 5.5 | 2 | 43 |
+----+------------+------------+------------+---
数据库来自同一个主机服务器,我希望每10秒左右更新5到50行。另外,让我们将随机整数的数量减少到12,这样我们就可以修复512到1024个字符之间的序列化字符串。无论存储序列化数组还是多列,性能可能不会有显著差异,除非您有非常高的流量和长字符串 当数组太长以至于序列化字符串不能放在单个数据库页面上时,它会产生任何可测量的差异。InnoDB会自动找到额外的页面来存储字符串的其余部分,但这意味着会有更多的页面加载、更多的磁盘搜索等。为了避免页面溢出,序列化的字符串必须为768字节或更少(有关详细说明,请参阅) 另一个需要考虑的问题是,当您有一个很长的字符串,并且只需要发布整个字符串来更新数组的单个成员时。这些字节必须以某种方式在网络中传输,当您使用序列化数组方法时,无法仅发布子字符串。字符串越长,更新的开销就越大。最终,如果同时执行大量更新,可能会耗尽所有网络带宽 例如,千兆比特网络(1000Mbit/s)的吞吐量约为112Mb/s。如果您的字符串平均为100KB,并且每秒有1125次并发更新,那么这就是您的全部带宽,即使在快速的专用网络上也是如此。这甚至不包括同一网络上的其他流量
请回复您的评论和更新:
听起来更新的数量和平均字符串长度都相当有限。这还不足以成为瓶颈。如果使用环回TCP/IP接口(127.0.0.1)进行连接,则不必担心带宽。如果您想确定,可以对其进行基准测试。就数据库结构而言,两者都不是非常规范化的。在性能方面,我的猜测是没有什么不同。最大的好处是将索引添加到
id
。是的,它是索引的,并且也是唯一的。Helpfull!比尔,请检查我编辑的问题。谢谢。