一个复杂查询还是多个简单查询:
传统实现不适合MySQL:
传统实现中,总是强调需要数据库层完成尽可能多的的工作,这样做的逻辑在于以前总是认为网络通信、查询解析和优化是一件代价很高的事情。
但这样的想法对于MySQL并不适用,MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。
即使在一个通用服务器上,也能够运行每秒超过10w的查询,即使是一个千兆网卡也能轻松满足每秒超过2k次的查询。所以运行多个小查询现在不是什么大问题了。
MySQL 内部每秒能够扫描内存中上百万行数据。相比之下,MySQL响应数据给客户端就慢得多了。在其他条件都相同的时候,使用尽可能少的查询当然是更好的。但是有时候,将一个大查询分解成多个小查询是很有必要的。
当然在应用设计的时候,如果一个查询能够胜任时还写成多个独立查询还是不明智的。
传统实现不适合MySQL:
传统实现中,总是强调需要数据库层完成尽可能多的的工作,这样做的逻辑在于以前总是认为网络通信、查询解析和优化是一件代价很高的事情。
但这样的想法对于MySQL并不适用,MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。
即使在一个通用服务器上,也能够运行每秒超过10w的查询,即使是一个千兆网卡也能轻松满足每秒超过2k次的查询。所以运行多个小查询现在不是什么大问题了。
MySQL 内部每秒能够扫描内存中上百万行数据。相比之下,MySQL响应数据给客户端就慢得多了。在其他条件都相同的时候,使用尽可能少的查询当然是更好的。但是有时候,将一个大查询分解成多个小查询是很有必要的。
当然在应用设计的时候,如果一个查询能够胜任时还写成多个独立查询还是不明智的。
/**
我日,以上问题说了等于没说,我擦 ,这样写浪费了多少文字啊,怪不得这么厚一本书。
*/
************
切分查询:
有时对于一个大查询我们需要‘分而治之’,将大查询切分成小查询,每个查询功能完全一样,只完成一小部分,每次只能返回小部分查询结果。
例如
删除旧的数据就是一个很好的例子:定时清除大量数据时,如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小但重要的查询。将一个大的delete语句切分成多个较小的查询可以尽可能小影响mysql性能,同时还可以减少mysql复制的延迟。例如,我们需要每个月运行一次下面的查询: