国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
查詢SQL歷程 " >查詢SQL歷程
如何定位慢SQL? " >如何定位慢SQL?
熟悉慢SQL日志分析工具嗎? " >熟悉慢SQL日志分析工具嗎?
使用方式 " >使用方式
實操
首頁 數(shù)據(jù)庫 SQL 美團面試題:慢SQL有遇到過嗎?是怎么解決的?

美團面試題:慢SQL有遇到過嗎?是怎么解決的?

Aug 24, 2023 pm 03:41 PM
sql sql查詢


關(guān)于慢SQL,我和面試官扯了很久,面試官也是很謙虛的,總是點頭,自己以為回答的還可以。最后的最后,還是說了“你先回去等通知吧!”。

美團面試題:慢SQL有遇到過嗎?是怎么解決的?

所以,我決定把這個慢SQL技術(shù)點,好好和你分享分享。希望你下次在遇到類似的面試,能順順利利輕輕松松的斬獲自己想要的offer。

人生最大的喜悅是每個人都說你做不到,你卻完成它了!

什么是慢SQL?

MySQL的慢查詢?nèi)罩臼荕ySQL提供的一種日志記錄,它用來記錄MySQL中查詢時間超過(大于)設(shè)置閾值(long_query_time)的語句,記錄到慢查詢?nèi)罩局小?/p>

其中,long_query_time的默認值是10,單位是秒,也就是說默認情況下,你的SQL查詢時間超過10秒就算慢SQL了。

如何開啟慢SQL日志?

在MySQL中,慢SQL日志默認是未開啟的,也就說就算出現(xiàn)了慢SQL,也不會告訴你的,如果需要知道哪些SQL是慢SQL,需要我們手動開啟慢SQL日志的。

關(guān)于慢SQL是否開啟,我們可以通過下面這個命令來查看:

-- 查看慢查詢?nèi)罩臼欠耖_啟
show variables like '%slow_query_log%';
美團面試題:慢SQL有遇到過嗎?是怎么解決的?
在這里插入圖片描述

通過命令,我們就可以看到slow_query_log項為OFF,說明我們的慢SQL日志并未開啟。另外我們也可以看到我們慢SQL日志存放于哪個目錄下和日志文件名。

下面我們來開啟慢SQL日志,執(zhí)行下面的命令:

set global slow_query_log = 1;

這里需要注意,這里開啟的是我們當(dāng)前的數(shù)據(jù)庫,并且,我們重啟數(shù)據(jù)庫后會失效的。

開啟慢SQL日志后,再次查看:

美團面試題:慢SQL有遇到過嗎?是怎么解決的?


slow_query_log項已經(jīng)變成ON,說明開啟成功。

上面說過慢SQL默認時間是10秒,我們通過下面的命令就可以看到我們慢SQL的默認時間:

show variables like '%long_query_time%';
美團面試題:慢SQL有遇到過嗎?是怎么解決的?
在這里插入圖片描述

我們總不能一直使用這個默認值,可能很多業(yè)務(wù)需要時間更短或更長,所以此時,我們就需要對默認時間進行修改,修改命令如下:

set long_query_time = 3;

修改完了,我們再來看看是否已經(jīng)改成了3秒。

美團面試題:慢SQL有遇到過嗎?是怎么解決的?


這里需要注意:想要永久的生效,還需要修改MySQL下面的配置文件my.cnf 文件。

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/atguigu-slow.log
long_query_time=3
log_output=FILE

注意:不同操作系統(tǒng),配置有些區(qū)別。

Linux操作系統(tǒng)中

在mysql配置文件my.cnf中增加

log-slow-queries=/var/lib/mysql/slowquery.log (指定日志文件存放位置,可以為空,系統(tǒng)會給一個缺省的文件host_name-slow.log)

long_query_time=2 (記錄超過的時間,默認為10s)

log-queries-not-using-indexes (log下來沒有使用索引的query,可以根據(jù)情況決定是否開啟)

log-long-format (如果設(shè)置了,所有沒有使用索引的查詢也將被記錄)

Windows操作系統(tǒng)中

在my.ini的[mysqld]添加如下語句:

log-slow-queries = E:\web\mysql\log\mysqlslowquery.log

long_query_time = 3(其他參數(shù)如上)

執(zhí)行一條慢SQL,因為我們前面已經(jīng)設(shè)置好了慢SQL時間為3秒,所以,我們只要執(zhí)行一條SQL時間超過3秒即可。

SELECT SLEEP(4);

美團面試題:慢SQL有遇到過嗎?是怎么解決的?


該SQL耗時4.024秒,下面我們就來查看慢SQL出現(xiàn)了多少條。

使用命令:

show global status like '%Slow_queries%';
美團面試題:慢SQL有遇到過嗎?是怎么解決的?

查詢SQL歷程

找到慢SQL日志文件,打開后就會出現(xiàn)類似下面這樣的語句;

# Time: 2021-07-20T09:17:49.791767Z
# User@Host: root[root] @ localhost []  Id:   150
# Query_time: 0.002549  Lock_time: 0.000144 Rows_sent: 1  Rows_examined: 4079
SET timestamp=1566292669;
select * from city where Name = 'Salala';

簡單說明:

1.Time 該日志記錄的時間

2.User @Host MySQL登錄的用戶和登錄的主機地址

3.Query_time一行 第一個時間是查詢的時間、第二個是鎖表的時間、第三個是返回的行數(shù)、第四個是掃描的行數(shù)

4.SET timestamp 這一個是MySQL查詢的時間

5.sql語句 這一行就很明顯了,表示的是我們執(zhí)行的sql語句

切記

如果你將long_query_time=0 ,那就意味著,我們所有的查詢SQL語句都會輸出到慢SQL日志文件中。

如何定位慢SQL?

通常我們定位慢SQL有兩種方式:

第一種:定位慢查詢SQL可以通過兩個表象進行判斷

  • 系統(tǒng)級表象:
    • 使用sar命令和top命令查看當(dāng)前系統(tǒng)的狀態(tài)
    • 也可以使用PrometheusGrafana監(jiān)控工具查看當(dāng)前系統(tǒng)狀態(tài)
    • CPU消耗嚴重
    • IO等待嚴重
    • 頁面響應(yīng)時間過長
    • 項目日志出現(xiàn)超時等錯誤
  • SQL語句表象:
    • SQL語句冗長
    • SQL語句執(zhí)行時間過長
    • SQL從全表掃描中獲取數(shù)據(jù)
    • 執(zhí)行計劃中的rowscost很大

第二種:根據(jù)不同的數(shù)據(jù)庫使用不同的方式獲取問題SQL

  • MySQL:
    • 慢查詢?nèi)罩?/section>
    • 測試工具loadrunner
    • ptquery工具
  • Oracle:
    • AWR報告
    • 測試工具loadrunner
    • 相關(guān)內(nèi)部視圖vsession_wait
    • GRID CONTROL監(jiān)控工具

熟悉慢SQL日志分析工具嗎?

如果開啟了慢SQL日志后,可能會有大量的慢SQL日志產(chǎn)生,此時再用肉眼看,那是不太現(xiàn)實的,所以大佬們就給我搞了個工具:mysqldumpslow。

mysqldumpslow能將相同的慢SQL歸類,并統(tǒng)計出相同的SQL執(zhí)行的次數(shù),每次執(zhí)行耗時多久、總耗時,每次返回的行數(shù)、總行數(shù),以及客戶端連接信息等。

通過命令

mysqldumpslow --help

可以看到相關(guān)參數(shù)的說明:

~# mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

  --verbose    verbose
  --debug      debug
  --help       write this text to standard output

  -v           verbose
  -d           debug
  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                al: average lock time
                ar: average rows sent
                at: average query time
                 c: count
                 l: lock time
                 r: rows sent
                 t: query time  
  -r           reverse the sort order (largest last instead of first)
  -t NUM       just show the top n queries
  -a           don't abstract all numbers to N and strings to 'S'
  -n NUM       abstract numbers with at least n digits within names
  -g PATTERN   grep: only consider stmts that include this string
  -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
               default is '*', i.e. match all
  -i NAME      name of server instance (if using mysql.server startup script)
  -l           don't subtract lock time from total time

比較常用的參數(shù)有這么幾個:

-s 指定輸出的排序方式
   t  : 根據(jù)query time(執(zhí)行時間)進行排序;
   at : 根據(jù)average query time(平均執(zhí)行時間)進行排序;(默認使用的方式)
   l  : 根據(jù)lock time(鎖定時間)進行排序;
   al : 根據(jù)average lock time(平均鎖定時間)進行排序;
   r  : 根據(jù)rows(掃描的行數(shù))進行排序;
   ar : 根據(jù)average rows(掃描的平均行數(shù))進行排序;
   c  : 根據(jù)日志中出現(xiàn)的總次數(shù)進行排序;
-t 指定輸出的sql語句條數(shù);
-a 不進行抽象顯示(默認會將數(shù)字抽象為N,字符串抽象為S);
-g 滿足指定條件,與grep相似;
-h 用來指定主機名(指定打開文件,通常慢查詢?nèi)罩久Q為“主機名-slow.log”,用-h exp則表示打開exp-slow.log文件);

使用方式

mysqldumpslow常用的使用方式如下:

# mysqldumpslow -s c slow.log

如上一條命令,應(yīng)該是mysqldumpslow最簡單的一種形式,其中-s參數(shù)是以什么方式排序的意思,c指代的是以總數(shù)從大到小的方式排序。-s的常用子參數(shù)有:c: 相同查詢以查詢條數(shù)和從大到小排序。t: 以查詢總時間的方式從大到小排序。l: 以查詢鎖的總時間的方式從大到小排序。at: 以查詢平均時間的方式從大到小排序。al: 以查詢鎖平均時間的方式從大到小排序。

同樣的,還可以增加其他參數(shù),實際使用的時候,按照自己的情況來。

其他常用方式:

# 得到返回記錄集最多的10 個SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log

# 得到訪問次數(shù)最多的10 個SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log

# 得到按照時間排序的前10 條里面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log

# 另外建議在使用這些命令時結(jié)合| 和more 使用,否則有可能出現(xiàn)爆屏情況
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

接下,我們來個實際操作。

實操

root@yunzongjitest1:~# mysqldumpslow -s t -t 3

Reading mysql slow query log from /var/lib/mysql/exp-slow.log /var/lib/mysql/yunzongjitest1-slow.log
Count: 464  Time=18.35s (8515s)  Lock=0.01s (3s)  Rows=90884.0 (42170176), root[root]@localhost
  select ************

Count: 38  Time=11.22s (426s)  Lock=0.00s (0s)  Rows=1.0 (38), root[root]@localhost
  select *********** not like 'S'

Count: 48  Time=5.07s (243s)  Lock=0.02s (1s)  Rows=1.0 (48), root[root]@localhost
  select ********='S'

這其中的SQL語句因為涉及某些信息,所以我都用*號將主體替換了,如果希望得到具體的值,使用-a參數(shù)。

使用mysqldumpslow查詢出來的摘要信息,包含了這些內(nèi)容:

Count: 464 :表示慢查詢?nèi)罩究偣灿涗浀竭@條sql語句執(zhí)行的次數(shù);

Time=18.35s (8515s):18.35s表示平均執(zhí)行時間(-s at),8515s表示總的執(zhí)行時間(-s t);

Lock=0.01s (3s):與上面的Time相同,第一個表示平均鎖定時間(-s al),括號內(nèi)的表示總的鎖定時間(-s l)(也有另一種說法,說是表示的等待鎖釋放的時間);

Rows=90884.0 (42170176): 第一個值表示掃描的平均行數(shù)(-s ar),括號內(nèi)的值表示掃描的總行數(shù)(-s r)。

以上是美團面試題:慢SQL有遇到過嗎?是怎么解決的?的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
MySQL:SQL的實際應(yīng)用 MySQL:SQL的實際應(yīng)用 May 08, 2025 am 12:12 AM

MySQL受歡迎的原因是其性能卓越且易于使用和維護。1.創(chuàng)建數(shù)據(jù)庫和表:使用CREATEDATABASE和CREATETABLE命令。2.插入和查詢數(shù)據(jù):通過INSERTINTO和SELECT語句操作數(shù)據(jù)。3.優(yōu)化查詢:使用索引和EXPLAIN語句提升性能。

比較SQL和MySQL:語法和功能 比較SQL和MySQL:語法和功能 May 07, 2025 am 12:11 AM

SQL和MySQL的區(qū)別與聯(lián)系如下:1.SQL是標(biāo)準語言,用于管理關(guān)系數(shù)據(jù)庫,MySQL是基于SQL的數(shù)據(jù)庫管理系統(tǒng)。2.SQL提供基本CRUD操作,MySQL在此基礎(chǔ)上增加了存儲過程、觸發(fā)器等功能。3.SQL語法標(biāo)準化,MySQL在某些地方有改進,如LIMIT用于限制返回行數(shù)。4.使用示例中,SQL和MySQL的查詢語法略有不同,MySQL的JOIN和GROUPBY更直觀。5.常見錯誤包括語法錯誤和性能問題,MySQL的EXPLAIN命令可用于調(diào)試和優(yōu)化查詢。

phpmyadmin的SQL窗口中的'書簽”是什么?如何保存經(jīng)常使用的查詢? phpmyadmin的SQL窗口中的'書簽”是什么?如何保存經(jīng)常使用的查詢? Jun 06, 2025 am 10:25 AM

BookmarksinphpMyAdminaresavedSQLqueriesthatstreamlinerepetitivetasks.Tousethem,createabookmarkbyclicking“Bookmarkthisquery”afterwritingorrunningaquery,optionallylabelit,andsetuseraccess.Savedbookmarksappearunder“BookmarkedSQLqueries”intheSQLwindow,wh

sql敲代碼從哪一步開始敲 sql代碼編寫起點指南 sql敲代碼從哪一步開始敲 sql代碼編寫起點指南 Jun 04, 2025 pm 07:27 PM

寫SQL代碼的起點是明確需求。1)理解你要解決的問題,確定所需數(shù)據(jù)和表的關(guān)系。2)從簡單的SELECT語句開始設(shè)計查詢,逐步增加復(fù)雜性。3)使用可視化工具理解表結(jié)構(gòu),并在復(fù)雜查詢時考慮使用JOIN。4)測試查詢并使用EXPLAIN命令優(yōu)化性能,避免常見陷阱如NULL值處理和索引使用不當(dāng)。

SQL的多功能性:從簡單查詢到復(fù)雜操作 SQL的多功能性:從簡單查詢到復(fù)雜操作 May 05, 2025 am 12:03 AM

SQL的多樣性和強大功能使其成為數(shù)據(jù)處理的利器。1.SQL的基本用法包括數(shù)據(jù)查詢、插入、更新和刪除。2.高級用法涵蓋多表連接、子查詢和窗口函數(shù)。3.常見錯誤包括語法、邏輯和性能問題,可通過逐步簡化查詢和使用EXPLAIN命令調(diào)試。4.性能優(yōu)化技巧包括使用索引、避免SELECT*和優(yōu)化JOIN操作。

如何在SQL中使用正則表達式進行更強大的模式匹配? 如何在SQL中使用正則表達式進行更強大的模式匹配? May 27, 2025 am 12:02 AM

你可以在SQL中使用正則表達式進行更強大的模式匹配,通過以下步驟:1)使用REGEXP或REGEXP_LIKE函數(shù)進行模式匹配和數(shù)據(jù)驗證;2)確保優(yōu)化性能,特別是在處理大型數(shù)據(jù)集時;3)記錄和簡化復(fù)雜的模式以提高可維護性。正則表達式在SQL中的應(yīng)用能顯著增強數(shù)據(jù)分析和操縱能力,但需要注意性能和模式復(fù)雜性。

SQL和數(shù)據(jù)分析:從信息中提取見解 SQL和數(shù)據(jù)分析:從信息中提取見解 May 04, 2025 am 12:10 AM

SQL在數(shù)據(jù)分析中的核心作用是通過查詢語句從數(shù)據(jù)庫中提取有價值的信息。1)基本用法:使用GROUPBY和SUM函數(shù)計算每個客戶的總訂單金額。2)高級用法:使用CTE和子查詢找出每個月銷售額最高的產(chǎn)品。3)常見錯誤:語法錯誤、邏輯錯誤和性能問題。4)性能優(yōu)化:使用索引、避免SELECT*和優(yōu)化JOIN操作。通過這些技巧和實踐,SQL能幫助我們從數(shù)據(jù)中提取洞見并確保查詢高效且易于維護。

超越接口:phpmyadmin和SQL的功能 超越接口:phpmyadmin和SQL的功能 May 02, 2025 am 12:21 AM

phpMyAdmin和SQL的結(jié)合允許用戶直接輸入和執(zhí)行SQL命令,實現(xiàn)更復(fù)雜的查詢和數(shù)據(jù)庫管理。 1)在phpMyAdmin中,你可以執(zhí)行SQL命令,如SELECTFROMusersWHEREage>30;2)使用EXPLAIN命令可以分析查詢的執(zhí)行計劃,優(yōu)化性能;3)通過創(chuàng)建索引、避免使用SELECT和使用LIMIT等方法,可以顯著提高查詢效率。

See all articles