MySQL的SQL執(zhí)行時(shí)間是指執(zhí)行一條SQL語(yǔ)句所花費(fèi)的時(shí)間。當(dāng)我們執(zhí)行一條SQL語(yǔ)句時(shí),MySQL會(huì)將該語(yǔ)句轉(zhuǎn)換成對(duì)應(yīng)的執(zhí)行計(jì)劃,然后按照該執(zhí)行計(jì)劃執(zhí)行該語(yǔ)句。
mysql>EXPLAIN SELECT * FROM orders WHERE order_date BETWEEN '2020-01-01' AND '2020-01-31';
執(zhí)行計(jì)劃可以通過(guò)使用EXPLAIN語(yǔ)句來(lái)查看。執(zhí)行計(jì)劃是一個(gè)樹(shù)形結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)表示一個(gè)操作,如掃描表、使用索引、排序等。每個(gè)節(jié)點(diǎn)都包含所執(zhí)行的操作和所花費(fèi)的時(shí)間。
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | orders| NULL | ALL | NULL | NULL | NULL| NULL |10000 | 10.00 |Using where | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
在執(zhí)行語(yǔ)句后,MySQL會(huì)返回一個(gè)結(jié)果集,并記錄該語(yǔ)句的執(zhí)行時(shí)間。
mysql>SELECT SQL_NO_CACHE * FROM orders WHERE order_date BETWEEN '2020-01-01' AND '2020-01-31';
在實(shí)際生產(chǎn)環(huán)境中,我們可以通過(guò)查看慢查詢(xún)?nèi)罩緛?lái)獲取SQL執(zhí)行時(shí)間。慢查詢(xún)?nèi)罩緯?huì)記錄超過(guò)指定時(shí)間閾值的SQL語(yǔ)句。
slow_query_log = 1 long_query_time = 2
以上代碼表示開(kāi)啟慢查詢(xún)?nèi)罩荆?zhí)行時(shí)間超過(guò)2秒的語(yǔ)句記錄到日志中。
通過(guò)定期分析慢查詢(xún)?nèi)罩竞蛨?zhí)行計(jì)劃,我們可以找出需要優(yōu)化的SQL語(yǔ)句和數(shù)據(jù)庫(kù)結(jié)構(gòu),從而提高系統(tǒng)的性能。