我们需要您的帮助来了解更多关于mariadb 10.2的内部内容。。
我们有一个复杂的查询。如果我们单独运行这个查询,它需要5秒钟。但如果并行运行同一个查询,则每个查询的运行时间更长。
查询的where部分包含一个随机整数,因此我们不使用查询缓存。我们的服务器有4个CPU。
我们的观察结果:
(1) 运行1个查询=>~5秒
(2) 运行同一查询4次(并行)=>每个查询运行约5.5秒
(3) 运行同一查询7次(并行)=>每个查询运行7秒
(4) 运行相同的查询10次(并行)=>每个查询运行约11秒
我们优化了查询,不需要临时磁盘表。我们可以看到,所有4个cpu都有大约80-90%的负载。
但我们不知道,为什么执行时间如此不同。
谢谢,雷内
2条答案
按热度按时间vkc1a9a21#
你有没有因为打开的应用程序太多而让你的笔记本电脑慢下来?
任何计算机都有有限的资源。cpu,ram,磁盘。如果运行的进程占用了大量资源,那么下一个进程的可用资源就会减少。
并行线程也是如此,每个线程运行一个查询。他们每个人都需要使用一些cpu来处理数据。如果数据在磁盘上,则需要将其加载到缓冲池中,这会占用一些磁盘带宽。
此外,一些内部数据结构需要全局锁。就像两个线程试图将页面加载到缓冲池中一样,两个线程都需要一个全局锁,这样它们就可以找到一个空闲页面。一个线程抓住锁,执行其工作,然后释放锁。第二个线程在此期间一直在等待。这种情况一秒钟发生很多次,但是线程越多,争用就越多。
sf6xfgos2#
让我们试着加快查询速度。
听起来好像查询正在执行表扫描或其他一些i/o密集型任务。请注意,磁盘(在大多数系统中)是单线程的。也就是说,您的“并行”并不扩展到i/o。
“我们优化了查询,不需要临时磁盘表。”——这只是众多优化之一。我们再多看看。
你们有什么“综合”指数吗?
是否在函数调用中隐藏索引列?
向我们展示查询,以及
SHOW CREATE TABLE
以及EXPLAIN SELECT ...