我对如何优化我的SQL查询有些困惑。我有一个中期查询,有些连接可以运行每秒一百千万次(SSD上的两张桌子,一张RAM中的一张桌子,4个加入)
)如何最大程度地减少开销以进行执行?有什么方法可以预编译查询,以便MySQL不需要每次分析,优化和编译查询?
我知道我可以使用准备好的语句来预编译查询,然后在同一会话中多次执行该查询。但是,如果您有多个会话,并且每个会话只有一个查询该怎么办?准备好的陈述是否在不同的会议上缓存?我不这么认为。
然后我认为存储程序是最好的方法,因为据说它们是预编译的。现在我读到这个假设是完全错误的,实际上它们不是预先编译的。
是在MySQL中共享客户赛的任何方法,例如在以下会话中继承的第一个会话中使用已准备好的语句?
最后一个想法是编写多线程套接字服务器,以表现为MySQL客户端proxy。但这对我来说似乎有些夸张。; - )
我将PHP用作Apache2模块。是否有机会在共享内存中"存储" MySQL会话,以便以下HTTP请求可以使用现有的MySQL会话而不是启动新的会话?这样我就可以在不同的http请求中使用已准备好的语句?
q: 有没有办法"重复使用" mySQL连接,以便后续请求可以使用现有连接?
A: 是。您可以使用连接池实现。这是Java的熟悉模式,有几种实现。
对于PHP中的连接池实现,您可以使用PHP扩展 mysqldnd-ms
。
参考:http://php.net/manual/en/mysqlnd-ms.pooling.php
注意:我没有此PHP扩展的个人经验。
您问的其他一些问题...
Q:如何最大程度地减少开销以进行执行?有什么方法可以预编译查询,以便MySQL不需要每次分析,优化和编译查询?
a:在MySQL 5.6中,您可以使用服务器端准备的语句。会话中已将准备好的语句的执行计划缓存,因此对同一SQL语句的重复呼叫可以重新使用先前准备的执行计划。(在5.6之前的MySQL版本中,此功能不可用。)
减少"连接流动**的数量"将减少MySQL开销。与数据库服务器的连接和断开连接是服务器必须执行的工作。它足够简单,可以测试和比较性能。在一个过程中,打开连接,一个连接,一个连接,并进行一些重复的工作(重复执行一个简单的语句,例如SELECT NOW()
,然后断开连接。在另一个过程中,运行SELECT的相同重复执行,但为每个执行进行连接并断开连接。
Q:已准备好在不同的会话中缓存的语句?
a:编号语句在语句会话级别。
Q:是在MySQL中共享客户端会议的任何方法,例如。在以下会话中继承的第一个会话中使用已准备好的语句?
a:编号。请求连接的后续客户。我们通过实现连接池。
来实现这一目标。我想说的是,这样做的最佳实践之一是避免基于O(n)时间的查询和功能。为了能够在高负载数据下表现出色,所有查询都必须在O(1)额外时间中。实际上的意思是,无论您要获取多少数据,查询总是需要同一时间。(线性方程)
我的意思是,如果您将ID存储在$_SESSION
var中,则可以在需要将查询时间从O(n)减少到O(1)。
如果您在阅读中陷入困境,则奴隶几乎可以允许无限的读取。
其他问题: - 批处理插入物很有帮助。 -InnoDB在并发访问方面更好。 - 越野潜伏期可能会导致延迟,这些延迟可以通过存储程序(和其他技术)来减轻。 - 通常,您要问的开销不如查询优化重要。 - SPS有时会因为延迟较小而有所帮助。 - *NIX比Windows好。 - 太多的"同时"连接可能适得其反。 - PHP会话不太可能有用。