我正在开发一个网站,我对性能感到担忧。
在当前系统中,存在诸如向单个表添加10,000行的事务。无关紧要,插入需要大约0.6秒。
但我担心如果有100,000个并发用户会发生什么,并且有1000个用户想要一次向一个表添加10,000行。
与单个用户相比,这对性能有何影响?如果在这种情况下有大量流量,我该如何改善这些交易呢?
答案 0 :(得分:3)
当写速度是强制性的时候,我们解决这个问题的方法就是让硬盘变得更快。 您提到了交易,这意味着您需要持久的数据(ACID的D)。这个要求排除了MyISAM存储引擎或任何类型的NoSQL,因此我将重点放在关系数据库的内容上。
它的工作方式是:每秒获得一定数量的输入输出操作或每个硬盘驱动器的IOPS。硬盘驱动器也有一个名为bandwith的度量标准。您感兴趣的指标是写入速度。 这里的一些粗略计算是这样的 - 每秒MB的数量除以IOPS的数量=每IOPS可以挤出多少数据。
对于机械驱动器,这个神奇的IOPS数量在150到300之间 - 非常低。鉴于它们的带宽大约为100 MB /秒,每次写入会得到真正少量的写入和带宽。这就是固态硬盘推出的地方 - 它们的IOPS数量从大约5 000开始(有些甚至达到80 000),这对数据库来说非常棒。
在RAID中连接这些驱动器可为您提供超快速的存储解决方案。如果您能够在一次交易中挤出10 000个插入,则磁盘将尝试通过1 IOPS挤压所有10k插入。
另一种策略是对表进行分区,并在MySQL存储数据的位置设置多个驱动器。
这就是你可以使用单个MySQL安装。有将策略分发到多个MySQL节点等的策略,但我认为这超出了你的问题的范围。
TL; DR:你需要更快的磁盘。
答案 1 :(得分:1)
如果您尝试扩展以每秒插入数百万行,则会遇到更大的问题。这可能每月累计数万亿行。在本月底之前,这是数百TB。你有足够大的磁盘场吗?你能买得起足够的SSD吗?
另一件事。拥有万亿行,除了简单的auto_increment之外,拥有任何索引都是非常具有挑战性的。没有任何索引,您如何计划访问数据?一万亿行的表扫描需要一天。
另外,你说了10万用户;你暗示它们是同时连接的吗?这也是一个挑战。
一次性生成10K行的用户有哪些?网络带宽怎么样?
等。等
如果你真的有这样的任务,Sharding可能是唯一的解决方案。除 SSD,RAID,IOP等等外,还有。
答案 2 :(得分:0)
您必须从软件和硬件角度考虑很少的东西。
必须考虑的事情:
- 使用SSD驱动器以获得更好的IO。
- 如果你有巨大的流量,那么拥有10GB的网络是件好事。
- 使用mysql 5.6或更高版本,他们在性能方面比以前的版本有了很大改进。
- 使用批量插入而不是顺序插入,如果可以将所有数据存储在文件中并使用load_data_infile,则更好。这将是 比常规插入快20倍。
醇>
Mysql提供了多种扩展方式。它取决于您的产品要求您想要的方式。