Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql 5.6中的性能问题_Mysql_Database_Database Performance_Query Performance - Fatal编程技术网

mysql 5.6中的性能问题

mysql 5.6中的性能问题,mysql,database,database-performance,query-performance,Mysql,Database,Database Performance,Query Performance,在mysql中插入、选择和更新表中的行时,我面临着严重的性能问题 我使用的表结构是 CREATE TABLE `sessions` ( `sessionid` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `expiry` datetime NOT NULL, `value` text NOT NULL, `data` text, PRIMARY KEY (`sessionid

在mysql中插入、选择和更新表中的行时,我面临着严重的性能问题

我使用的表结构是

CREATE TABLE `sessions` (
     `sessionid` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
     `expiry` datetime NOT NULL,
     `value` text NOT NULL,
     `data` text,
     PRIMARY KEY (`sessionid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Sessions';
我面临的问题是:

INSERT INTO sessions (SESSIONID, EXPIRY, DATA, VALUE) VALUES ('b8c10810c505ba170dd9403072b310ed', '2019-05-01 17:25:50', 'PFJlc3BvbnNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM', '7bKDofc/pyFSQhm7QE5jb6951Ahg6Sk8OCVZI7AcbUPb4jZpHdrCAKuCPupJO14DNY3jULxKppLadGlpsKBifiJavZ/');

UPDATE sessions SET EXPIRY = '2019-05-01 17:26:07' WHERE (SESSIONID = 'e99a0889437448091a06a43a44d0f170');

SELECT SESSIONID, EXPIRY, DATA, VALUE FROM sessions WHERE (SESSIONID = '507a752c48fc9cc3043a3dbe889c52eb');
我试图解释查询,但无法推断出关于优化表/查询的更多信息

从慢速查询报告中可以看到所用的时间

选择平均值为23.45,更新平均值为15.93,插入平均值为 22.31


非常感谢您在识别问题方面提供的任何帮助。

您的查询看起来不错,但问题在于您的服务器可能没有足够的内存来处理此类请求,您可以增加数据库服务器的内存以获得优化的响应


每秒有多少查询

这张桌子有多大

多少公羊

innodb\u buffer\u pool\u size的值是多少

UUID对性能很糟糕。(这是SHA1吗?)这是因为它们是如此随机,以至于“下一个”查询(您提到的任何查询)可能不在缓存中,因此需要进行磁盘命中

因此,对于一个比缓冲池大得多的表,用一个旋转的驱动器每秒无法支持超过100个查询。SSD会更快

更多关于UUID的弊病(SHA1具有相同的不幸属性,但没有像UUID那样的解决方案):

您可以做的一件小事是缩小表:

session_id BINARY(20)
插入/更新/删除时使用
UNHEX()
,选择时使用
HEX()

更多

51KB平均行长度-->
文本
列很大,且“记录外”,因此需要多个块来处理一行

0.8GB的缓冲池,但20GB的数据,以及“随机”主键,缓存实际上是无用的

这意味着每个查询将有多个磁盘点击,但可能不到10次

300毫秒(很快)-->硬盘上的磁盘点击率约为30次(SSD上的点击率更高;您有哪些?)

因此,我必须猜测,当一个查询发生20秒时,会有一个突发的活动,使查询相互交错,导致大量的I/O争用

怎么办?大多数数据看起来像十六进制。如果这是真的,您可以通过打包并使用
BINARY(…)
BLOB
将磁盘占用空间减少一半(并减少一些需要的磁盘点击)

INSERT INTO sessions (SESSIONID, EXPIRY, DATA, VALUE)
    VALUES (UNHEX('b8c10810c505ba170dd9403072b310ed'),
            '2019-05-01 17:25:50',
            UNHEX('PFJlc3BvbnNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM'),
            UNHEX('7bKDofc/pyFSQhm7QE5jb6951Ahg6Sk8OCVZI7AcbUPb4jZpHdrCAKuCPupJO14DNY3jULxKppLadGlpsKBifiJavZ/'));

UPDATE sessions SET EXPIRY = '2019-05-01 17:26:07'
 WHERE SESSIONID = UNHEX('e99a0889437448091a06a43a44d0f170');

SELECT SESSIONID, EXPIRY, DATA, VALUE FROM sessions
 WHERE SESSIONID = UNHEX('507a752c48fc9cc3043a3dbe889c52eb');


而且
ROW\u FORMAT=DYNAMIC
可能是最佳的(但这并不重要)。

也阅读此文章以了解更多详细信息。我可以看到响应时间并不总是很长,有时响应时间为3亿秒,有时为20-60秒。@Delon-即使在缓存和内存大小最差的情况下,单行查询也是如此(选择/更新/删除/插入)不应超过一秒钟。必须进行其他操作??每秒最多20-40次查询,最多20000行,10GB内存,innodb_buffer_pool_大小为772800512,我使用的UUID是使用加密强伪随机数生成器生成的。innodb,版本10,行格式紧凑,行391,平均行长50995,data_length 19939328,max_data_length 0,index_length 0,data_free 76546048我们没有使用SSD驱动器。这是在偷窥期间我们一直遇到的问题。您的建议看起来很可靠,我会尝试一下。@Delon-由于数据远小于缓冲池大小,我看不到RAM问题。让我们分析一下您的设置,看看有什么问题
long\u query\u time
?的设置,如果默认值为10(秒),它只捕获了几个查询。但是,这些查询的数量太高了。是否同时发生了备份?一个
ALTER TABLE
?其他一些“大的”?长的查询时间是10秒。没有配置备份,我们也没有做任何DDL操作。可能有数百个这样的查询同时运行?看看您是否需要可以通过
SHOW PROCESSLIST;
 `sessionid` VARBINARY(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 `expiry` datetime NOT NULL,
 `value` BLOB NOT NULL,
 `data` BLOB,