最近我们一直在我们的MySQL服务器有很多问题,从网站很慢,甚至无法加载它们。 服务器是只运行我们的MySQL数据库的专用服务器。 我一直在使用一个探查器(JetProfiler)和压力testing工具(loadUI)进行一些testing。
如果我使用loadUI连接50个同时连接到我们的网站之一,运行一个极大的查询它已经使网站无法加载。 其中一个让我担心的事情是,当我看着Jetprofile时,它总是显示1.00的Treads_connected,而且当它碰到2.00时,我无法连接。

这三大高峰是我用loadUI进行testing时,第一个是15个同时连接,使得它仍然能够加载网站,但真的很慢,第二个是40个同时连接,已经无法加载和第三个是100连接,也没有使其负载了。
另一件让我担心的事情是,在JetProfiler中,所有使用的查询都是全表扫描,这可能是问题所在吗? 我作为testing运行的网站运行3个查询,其中一个用于输出大约1000行的菜单,一个用于大约560行的增加,另一个用于获取大约7000行的大小的查询(见下图截图)

我也监视了服务器的CPU,这里似乎没有问题,甚至当我用loadui做了很多连接的时候,CPU仍然很低。
我似乎无法弄清楚当网站stream量很高时,网站无法加载的主要原因是什么,如果有人有其他的testingbuild议或者可能导致问题的东西,请告诉我。
一些不错的图片,但是有很多信息从你的post中遗漏。
什么是最大的连接? 数据库有多大? 什么引擎? 什么是关键的缓冲区大小? DBMS有多less空闲内存?
全表扫描,这可能是问题吗?
可能是 – 没有足够的信息来说。 如果查询需要读取大约十分之一的数据,则全表扫描将比索引查找更快。
查询,一个用于输出大约1000行的菜单
您的网页上有1000个条目的菜单? 那么你的大部分问题都不在数据库中。 您的应用程序正在从数据库中获取太多的数据。 如果这是通过互联网发送这个信息,那么性能将是令人震惊的 。 如果它没有发出所有提取的数据,那你为什么不在DBMS上进行过滤?
每个表都有一个主索引,就是这个
也许你应该考虑将你的模式与你的查询alignment(即添加相关索引),但是你认为你得到的最大的问题是你正在从没有被使用的DBMS中获取数据。
OTOH是否意味着当你使用与截图一样的工具分析查询时,它会告诉你它正在处理数千行? 在这种情况下,修改索引会产生巨大的影响。
当同时连接数量增加时发生减速,这可能是连接池问题。 如果服务器/连接池被设置为只允许一定数量的连接(比如5),那么以后的连接将排队,直到队列中有空间。 同样,如果一个页面命中导致各种SQL查询被触发,但是每一个打开一个全新的MySQL连接(而不是重新使用一个更早的连接),那么这可能导致大量的连接请求被生成。
如何控制连接池是特定于实现的(不同的语言/库以不同的方式进行),并且至多保持打开数据库的连接数是最佳select。 对于像Tomcat这样的系统,Tomcat本身可以设置为在数据库启动时打开数据库的连接,并在需要时将这些连接用于应用程序/ servlet。 你必须分析你的应用程序和使用情况,看看什么是明智的甜蜜点(因为打开不必要的连接使用内存)。
否则,大多数用于网页材料的脚本语言(例如)都有数据库库,在页面开始时打开一个连接,然后在页面的其余部分重新使用该引用。 值得检查是否发生这种情况(尽pipe你可能没有对代码进行大规模的控制)。
我正在把这个时间问题基于Tomcat Web应用程序和专有数据库系统之间的连接池。 这可能不相关。