将mysql查询速度提高不到0.1ms /请求

时间:2018-11-23 21:10:23

标签: mysql performance database-performance query-performance sqlperformance

关于

对于任何单个查询,MariaDB服务器都要为每个请求花费大约1ms的时间。当并发性增加时,每个请求的查询时间也会增加,直到超时为止。到目前为止,似乎每个mysql服务器实例每秒最多只能建立约2k个最大连接,似乎没有多少配置tweeking会产生任何影响。有什么方法可以将每个客户端的查询时间减少不到0.1毫秒?

这是查询

select ID from table where id=1;

如果有帮助,这是mysql配置文件

[client]
port        = 3306
socket      = /home/user/mysql.sock
[mysqld]
port        = 3306
bind-address=127.0.0.1
datadir=/home/user/database
log-error=/home/user/error.log
pid-file=/home/user/mysqld.pid
innodb_file_per_table=1
back_log = 2000
max_connections = 1000000
max_connect_errors = 10
table_open_cache = 2048
max_allowed_packet = 16M
binlog_cache_size = 1M
max_heap_table_size = 64M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 8M
thread_cache_size = 8
thread_concurrency = 200
query_cache_size = 64M
query_cache_type = 1 #My settings
innodb_io_capacity = 100000
query_cache_limit = 2M
ft_min_word_len = 4
default-storage-engine = innodb
thread_stack = 240K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 64M
log-bin=mysql-bin
binlog_format=mixed
slow_query_log
long_query_time = 2
server-id = 1
key_buffer_size = 32M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
innodb_buffer_pool_size = 2G
innodb_data_file_path = ibdata1:10M:autoextend
innodb_doublewrite = 0
sync_binlog=0
skip_name_resolve
innodb_write_io_threads = 500
innodb_read_io_threads = 500
innodb_thread_concurrency = 1000
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
open-files-limit = 81920

硬件

2个Intel Xeon 2670 32 Gb RAM 500Gb ssd三星evo 850

绕行

虽然MySql每秒可以进行超过一百万次查询,但测试here仅执行了250个连接的客户端。

PS

我还不是编程或mysql方面的专家,所以请多多包涵。

1 个答案:

答案 0 :(得分:0)

您的机器有4核,对吗?因此,如果同时运行4个以上受CPU约束的进程,则CPU将处于饱和状态。这意味着每个线程将被中断以让其他线程运行。也就是说,等待时间会增加

您的目标是缩短平均查询时间吗?那是延迟吗?那么更多的连接将无济于事

是每秒的目标查询数,然后,一旦CPU饱和,您将被停止。在连接到8个连接之前,可能会发生这种情况。 CPU饱和后,即使增加连接数,吞吐量(查询/秒)也会趋于稳定。但是,正如我已经说过的那样,单个查询的延迟会增加

如果要推动机器,请在每个连接中进行多个查询。否则,您将仅计时连接处理。这不是有用的指标。​​

如果添加更多服务器(通过复制,群集等),则每秒可以运行更多查询。同上更多核心。但是,什么也不会减少单个查询所花费的时间。

在设置中,max_connections = 1000000太可笑了,可能会消耗大量RAM。正如我所说的,基准测试可以处理的仅是8个。

另一种设置...打开查询缓存具有欺骗性。如果相关表未更改,它可以加快运行相同 SELECT 的速度。也就是说,查询的第一次运行可能需要1.0毫秒;那么 same 查询的所有后续运行都可能需要0.1毫秒。这不是一个令人兴奋的发现。两次执行查询-这将为您提供所有知识,而无需启动任何基准平台等。

但是大多数生产机器发现质量控制是没有用的。这是因为数据在变化,因此质量控制已过期。实际上,“清除”质量控制的成本可能会使查询运行速度变慢!

如果您希望读取大量连接,则复制从站可以提供无限个连接。我以前使用的系统有23个从站。提供了23倍的连接。 Booking.com的系统具有超过100个从站。这样便可以快速查找酒店空房情况。

请备份并考虑您的真正目标是什么。然后我们可以进一步讨论。