中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

什么是查詢離群值及其解決方法

發(fā)布于:2020-12-19 18:08:39

0

626

0

查詢 離群值 解決方法

在MySQL的數(shù)據(jù)庫(kù)工作負(fù)載是由它處理查詢的數(shù)量來(lái)確定。在許多情況下,MySQL速度緩慢都可能產(chǎn)生。第一種可能性是,如果有任何查詢未使用正確的索引。當(dāng)查詢無(wú)法使用索引時(shí),MySQL服務(wù)器必須使用更多的資源和時(shí)間來(lái)處理該查詢。通過(guò)監(jiān)視查詢,您可以查明是減速的根本原因的SQL代碼,并在整體性能降低之前進(jìn)行修復(fù)。

在此博客文章中,我們將重點(diǎn)介紹ClusterControl中可用的“查詢異常值”功能,并了解它如何幫助我們提高數(shù)據(jù)庫(kù)性能。通常,ClusterControl通過(guò)兩種方式執(zhí)行MySQL查詢采樣:

  1. 從性能模式中獲取查詢(推薦)。

  2. 解析MySQL慢查詢的內(nèi)容。

如果禁用了性能架構(gòu),則ClusterControl將默認(rèn)為慢查詢?nèi)罩尽R私庥嘘P(guān)ClusterControl如何執(zhí)行此操作的更多信息,請(qǐng)查看此博客文章“如何對(duì)MySQL,MariaDB和Percona Server使用ClusterControl查詢監(jiān)視器”。

什么是查詢離群值?

離群值是比該類型的正常查詢時(shí)間更長(zhǎng)的查詢時(shí)間。不要從字面上將其視為“寫得不好”的查詢。應(yīng)該將其視為可以改進(jìn)的潛在次優(yōu)常見查詢。經(jīng)過(guò)大量采樣后,當(dāng)ClusterControl具有足夠的統(tǒng)計(jì)信息時(shí),它可以確定延遲是否高于正常值(2 sigma + average_query_time),那么它是一個(gè)離群值,將被添加到查詢離群值中。

此功能取決于“熱門查詢”功能。如果啟用了“查詢監(jiān)視”并且捕獲并填充了“熱門查詢”,則“查詢異常值”將匯總這些內(nèi)容并提供基于時(shí)間戳的過(guò)濾器。要查看需要注意的查詢列表,請(qǐng)轉(zhuǎn)到ClusterControl-> Query Monitor-> Query Outliers,并應(yīng)列出列出的一些查詢(如果有):

從上面的屏幕快照中可以看到,異常值基本上是比平均查詢時(shí)間長(zhǎng)至少2倍的查詢。首先是第一個(gè)條目,平均時(shí)間是34.41 ms,而異常值的查詢時(shí)間是140 ms(比平均時(shí)間長(zhǎng)2倍多)。同樣,對(duì)于下一個(gè)條目,“查詢時(shí)間”和“平均查詢時(shí)間”列是兩個(gè)重要的事實(shí),可用來(lái)證明特定異常查詢的優(yōu)劣。 

通過(guò)查看更長(zhǎng)的時(shí)間段(例如一周前),相對(duì)容易找到特定查詢異常值的模式,如以下屏幕截圖所示:

通過(guò)單擊每一行,您可以看到完整的查詢,這對(duì)于查明和理解問(wèn)題確實(shí)很有幫助,如下一節(jié)所示。

修復(fù)查詢異常值

要修復(fù)異常值,我們需要了解查詢的性質(zhì),表的存儲(chǔ)引擎,數(shù)據(jù)庫(kù)版本,集群類型以及查詢的影響力。在某些情況下,異常查詢并沒有真正降低整體數(shù)據(jù)庫(kù)性能。如本例所示,我們已經(jīng)看到查詢已經(jīng)整整一個(gè)星期脫穎而出,并且它是唯一捕獲的查詢類型,因此如果可能的話,修復(fù)或改進(jìn)此查詢可能是一個(gè)好主意。

在本例中,異常查詢?yōu)椋?/span>

1個(gè)

2

3

4

5

6

SELECT i2l.country_code AS country_code, i2l.country_name AS country_name <font></font>

FROM ip2location i2l <font></font>

WHERE (i2l.ip_to >= INET_ATON('104.144.171.139') <font></font>

AND i2l.ip_from <= INET_ATON('104.144.171.139')) <font></font>

LIMIT 1 <font></font>

OFFSET 0;

查詢結(jié)果為:

1個(gè)

2

3

4

5

+--------------+---------------+<font></font>

| country_code | country_name  |<font></font>

+--------------+---------------+<font></font>

| US           | United States |<font></font>

+--------------+---------------+

使用EXPLAIN

該查詢是只讀范圍選擇查詢,用于確定表ip2location上IP地址的用戶地理位置信息(國(guó)家/地區(qū)代碼和國(guó)家/地區(qū)名稱)。使用EXPLAIN語(yǔ)句可以幫助我們了解查詢執(zhí)行計(jì)劃:

1個(gè)

2

3

4

5

6

7

8

9

10

mysql> EXPLAIN SELECT i2l.country_code AS country_code, i2l.country_name AS country_name <font></font>

FROM ip2location i2l <font></font>

WHERE (i2l.ip_to>=INET_ATON('104.144.171.139') <font></font>

AND i2l.ip_from<=INET_ATON('104.144.171.139')) <font></font>

LIMIT 1 OFFSET 0;<font></font>

+----+-------------+-------+------------+-------+--------------------------------------+-------------+---------+------+-------+----------+------------------------------------+<font></font>

| id | select_type | table | partitions | type  | possible_keys                        | key         | key_len | ref  | rows  | filtered | Extra                              |<font></font>

+----+-------------+-------+------------+-------+--------------------------------------+-------------+---------+------+-------+----------+------------------------------------+<font></font>

|  1 | SIMPLE      | i2l   | NULL       | range | idx_ip_from,idx_ip_to,idx_ip_from_to | idx_ip_from | 5       | NULL | 66043 |    50.00 | Using index condition; Using where |<font></font>

+----+-------------+-------+------------+-------+--------------------------------------+-------------+---------+------+-------+----------+------------------------------------+

使用具有50%潛在行(已過(guò)濾)的索引idx_ip_from對(duì)表進(jìn)行范圍掃描來(lái)執(zhí)行查詢。

適當(dāng)?shù)拇鎯?chǔ)引擎

查看ip2location的表結(jié)構(gòu):

1個(gè)

2

3

4

5

6

7

8

9

10

11

12

mysql> SHOW CREATE TABLE ip2locationG<font></font>

*************************** 1. row ***************************<font></font>

       Table: ip2location<font></font>

Create Table: CREATE TABLE `ip2location` (<font></font>

  `ip_from` int(10) unsigned DEFAULT NULL,<font></font>

  `ip_to` int(10) unsigned DEFAULT NULL,<font></font>

  `country_code` char(2) COLLATE utf8_bin DEFAULT NULL,<font></font>

  `country_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,<font></font>

  KEY `idx_ip_from` (`ip_from`),<font></font>

  KEY `idx_ip_to` (`ip_to`),<font></font>

  KEY `idx_ip_from_to` (`ip_from`,`ip_to`)<font></font>

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

該表基于 IP2location數(shù)據(jù)庫(kù),很少更新/寫入,通常僅在日歷月的第一天(由供應(yīng)商推薦)。因此,一種選擇是將表轉(zhuǎn)換為具有固定行格式的MyISAM(MySQL)或Aria(MariaDB)存儲(chǔ)引擎,以獲得更好的只讀性能。請(qǐng)注意,這僅適用于在MySQL或MariaDB獨(dú)立或復(fù)制上運(yùn)行的情況。在Galera群集和組復(fù)制上,請(qǐng)堅(jiān)持使用InnoDB存儲(chǔ)引擎(除非您知道自己在做什么)。

無(wú)論如何,要將表從InnoDB轉(zhuǎn)換為具有固定行格式的MyISAM,只需運(yùn)行以下命令:

1個(gè)

ALTER TABLE ip2location ENGINE=MyISAM ROW_FORMAT=FIXED;

在我們的測(cè)量中,通過(guò)1000次隨機(jī)IP地址查找測(cè)試,使用MyISAM和固定行格式,查詢性能提高了約20%:

  • 平均時(shí)間(InnoDB):21.467823 ms

  • 平均時(shí)間(固定了MyISAM):17.175942毫秒

  • 改善:19.992157565301%

您可以期望該結(jié)果在更改表后立即生效。無(wú)需在更高層(應(yīng)用程序/負(fù)載平衡器)上進(jìn)行修改。

調(diào)整查詢

另一種方法是檢查查詢計(jì)劃,并使用更有效的方法來(lái)制定更好的查詢執(zhí)行計(jì)劃。也可以使用子查詢來(lái)編寫相同的查詢,如下所示:

1個(gè)

2

3

4

5

6

7

SELECT `country_code`, `country_name` FROM <font></font>

  (SELECT `country_code`, `country_name`, `ip_from` <font></font>

   FROM `ip2location` <font></font>

   WHERE ip_to >= INET_ATON('104.144.171.139') <font></font>

   LIMIT 1) <font></font>

AS temptable <font></font>

WHERE ip_from <= INET_ATON('104.144.171.139');

調(diào)整后的查詢具有以下查詢執(zhí)行計(jì)劃:

1個(gè)

2

3

4

5

6

7

8

9

10

11

12

13

mysql> EXPLAIN SELECT `country_code`,`country_name` FROM <font></font>

(SELECT `country_code`, `country_name`, `ip_from` <font></font>

FROM `ip2location` <font></font>

WHERE ip_to >= INET_ATON('104.144.171.139') <font></font>

LIMIT 1) <font></font>

AS temptable <font></font>

WHERE ip_from <= INET_ATON('104.144.171.139');<font></font>

+----+-------------+--------------+------------+--------+---------------+-----------+---------+------+-------+----------+-----------------------+<font></font>

| id | select_type | table        | partitions | type   | possible_keys | key       | key_len | ref  | rows  | filtered | Extra                 |<font></font>

+----+-------------+--------------+------------+--------+---------------+-----------+---------+------+-------+----------+-----------------------+<font></font>

|  1 | PRIMARY     | <derived2>   | NULL       | system | NULL          | NULL      | NULL    | NULL |     1 |   100.00 | NULL                  |<font></font>

|  2 | DERIVED     | ip2location  | NULL       | range  | idx_ip_to     | idx_ip_to | 5       | NULL | 66380 |   100.00 | Using index condition |<font></font>

+----+-------------+--------------+------------+--------+---------------+-----------+---------+------+-------+----------+-----------------------+

使用子查詢,我們可以通過(guò)使用專注于一個(gè)索引的派生表來(lái)優(yōu)化查詢。查詢應(yīng)僅返回ip_to值大于或等于IP地址值的1條記錄。這樣可使?jié)撛谛校ㄒ堰^(guò)濾)達(dá)到100%,這是最有效的。然后,檢查ip_from小于或等于IP地址值。如果是,那么我們應(yīng)該找到記錄。否則,ip2location表中不存在IP地址。

在我們的評(píng)估中,使用子查詢的查詢性能提高了約99%:

  • 平均時(shí)間(InnoDB +范圍掃描):22.87112 ms

  • 平均時(shí)間(InnoDB +子查詢):0.14744 ms

  • 改善:99.355344207017%

通過(guò)上面的優(yōu)化,我們可以看到這種查詢類型的亞毫秒級(jí)查詢執(zhí)行時(shí)間,考慮到以前的平均時(shí)間為22毫秒,這是一個(gè)巨大的改進(jìn)。但是,我們需要對(duì)更高層(應(yīng)用程序/負(fù)載平衡器)進(jìn)行一些修改,以便從此優(yōu)化查詢中受益。

修補(bǔ)或查詢重寫

修補(bǔ)您的應(yīng)用程序以使用調(diào)整后的查詢或在異常查詢到達(dá)數(shù)據(jù)庫(kù)服務(wù)器之前對(duì)其進(jìn)行重寫。我們可以通過(guò)使用MySQL負(fù)載均衡器(例如ProxySQL(查詢規(guī)則)或MariaDB MaxScale(語(yǔ)句重寫過(guò)濾器))或使用MySQL Query Rewriter插件來(lái)實(shí)現(xiàn)此目的。在下面的示例中,我們?cè)跀?shù)據(jù)庫(kù)集群的前面使用ProxySQL,我們可以簡(jiǎn)單地創(chuàng)建一條規(guī)則以將較慢的查詢重寫為較快的查詢,例如:

保存查詢規(guī)則并監(jiān)視ClusterControl中的“查詢異常值”頁(yè)面。激活查詢規(guī)則后,此修復(fù)程序顯然將從列表中刪除異常查詢。

結(jié)論

查詢離群值是一種主動(dòng)的查詢監(jiān)視工具,可以幫助我們?cè)谛阅軉?wèn)題失去控制之前理解并解決性能問(wèn)題。隨著應(yīng)用程序的增長(zhǎng)和要求越來(lái)越高,此工具可以幫助您始終保持良好的數(shù)據(jù)庫(kù)性能。