MySQL怎么查詢比較耗時的sql語句
開啟慢查詢日志即可
文件方式配置 MySQL 慢查詢的方法:
在 mysql 配置文件 * 中增加:
log-slow-queries=/opt/data/*
long_query_time=2
log-queries-not-using-indexes
命令方式配置 MySQL 慢查詢的方法:
set global slow_query_log=on;
set global long_query_time=1;
set global slow_query_log_file='/opt/data/slow_*';
查詢 MySQL 慢查詢狀態的方法:
SHOW VARIABLES LIKE '%query%';
解析 MySQL 慢查詢日志的方法:
按照 sql 執行時間最長的前 20 條 sql:
mysqldumpslow -s t -t 20 -g 'select' /opt/data/*
mysql的一條查詢語句
--多個like
select * from table where (name like 'a%') or (name like 'b%') or (name like 'c%')--正則
--(下面的例子只適用第一個字符匹配)
select * from table where name REGEXP '^[abc]'
--(下面的例子適用多個字符匹配)
select * from table where name REGEXP '^(a2|b2|c2)'
如何查找MySQL中查詢慢的SQL語句
1,slow_query_log這個參數設置為ON,可以捕獲執行時間超過一定數值的SQL語句。
2,long_query_time當SQL語句執行時間超過此數值時,就會被記錄到日志中,建議設置為1或者更短。3,slow_query_log_file記錄日志的文件名。
4,log_queries_not_using_indexes這個參數設置為ON,可以捕獲到所有未使用索引的SQL語句,盡管這個SQL語句有可能執行得挺快。二、檢測mysql中sql語句的效率的方法1、通過查詢日志(1)、Windows下開啟MySQL慢查詢MySQL在Windows系統中的配置文件一般是是*找到[mysqld]下面加上代碼如下log-slow-queries = F:/MySQL/log/mysqlslowquery。
log long_query_time = 2(2)、Linux下啟用MySQL慢查詢MySQL在Windows系統中的配置文件一般是是*找到[mysqld]下面加上代碼如下log-slow-queries=/data/mysqldata/slowquery。log long_query_time=2說明log-slow-queries = F:/MySQL/log/mysqlslowquery。
為慢查詢日志存放的位置,一般這個目錄要有MySQL的運行帳號的可寫權限,一般都將這個目錄設置為MySQL的數據存放目錄; long_query_time=2中的2表示查詢超過兩秒才記錄;* processlist 命令SHOW PROCESSLIST顯示哪些線程正在運行。您也可以使用mysqladmin processlist語句得到此信息。
各列的含義和用途:ID列一個標識,你要kill一個語句的時候很有用,用命令殺掉此查詢 /*/mysqladmin kill 進程號。user列顯示單前用戶,如果不是root,這個命令就只顯示你權限范圍內的sql語句。
host列顯示這個語句是從哪個ip的哪個端口上發出的。用于追蹤出問題語句的用戶。
db列顯示這個進程目前連接的是哪個數據庫。command列顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。
time列此這個狀態持續的時間,單位是秒。state列顯示使用當前連接的sql語句的狀態,很重要的列,后續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個 sql語句,以查詢為例,可能需要經過copying to tmp table,Sorting result,Sending data等狀態才可以完成info列顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。
這個命令中最關鍵的就是state列,mysql列出的狀態主要有以下幾種:Checking table 正在檢查數據表(這是自動的)。 Closing tables 正在將表中修改的數據刷新到磁盤中,同時正在關閉已經用完的表。
這是一個很快的操作,如果不是這樣的話,就應該確認磁盤空間是否已經滿了或者磁盤是否正處于重負中。 Connect Out 復制從服務器正在連接主服務器。
Copying to tmp table on disk 由于臨時結果集大于tmp_table_size,正在將臨時表從內存存儲轉為磁盤存儲以此節省內存。 Creating tmp table 正在創建臨時表以存放部分查詢結果。
deleting from main table 服務器正在執行多表刪除中的第一部分,剛刪除第一個表。 deleting from reference tables 服務器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。
Flushing tables 正在執行FLUSH TABLES,等待其他線程關閉數據表。 Killed 發送了一個kill請求給某線程,那么這個線程將會檢查kill標志位,同時會放棄下一個kill請求。
MySQL會在每次的主循環中檢查kill標志位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那么kill請求會在鎖釋放時馬上生效。
Locked 被其他查詢鎖住了。 Sending data 正在處理SELECT查詢的記錄,同時正在把結果發送給客戶端。
Sorting for group 正在為GROUP BY做排序。 Sorting for order 正在為ORDER BY做排序。
Opening tables 這個過程應該會很快,除非受到其他因素的干擾。例如,在執ALTER TABLE或LOCK TABLE語句行完以前,數據表無法被其他線程打開。
正嘗試打開一個表。 Removing duplicates 正在執行一個SELECT DISTINCT方式的查詢,但是MySQL無法在前一個階段優化掉那些重復的記錄。
因此,MySQL需要再次去掉重復的記錄,然后再把結果發送給客戶端。Reopen table 獲得了對一個表的鎖,但是必須在表結構修改之后才能獲得這個鎖。
已經釋放鎖,關閉數據表,正嘗試重新打開數據表。 Repair by sorting 修復指令正在排序以創建索引。
Repair with keycache 修復指令正在利用索引緩存一個一個地創建新索引。它會比Repair by sorting慢些。
Searching rows for update 正在講符合條件的記錄找出來以備更新。它必須在UPDATE要修改相關的記錄之前就完成了。
Sleeping 正在等待客戶端發送新請求.System lock 正在等待取得一個外部的系統鎖。如果當前沒有運行多個mysqld服務器同時請求同一個表,那么可以通過增加--skip-external-locking參數來禁止外部系統鎖。
Upgrading lock INSERT DELAYED正在嘗試取得一個鎖表以插入新記錄。 Updating 正在搜索匹配的記錄,并且修改它們。
User Lock 正在等待GET_LOCK()。 Waiting for tables 該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。
然后,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。
mysql查詢語句
假設數據庫的表名稱為sunif,執行以下語句即可實現 select 編號, A發 AS 發, A銷 AS 銷, A退 AS 退, A發-A銷-A退 AS 結余, B發 AS 發, B銷 AS 銷, B退 AS 退, B發-B銷-B退 AS 結余 from(select 編號, SUM(CASE when (區域='A區' and 類型='發') then 數量 END ) AS A發, SUM(CASE when (區域='A區' and 類型='銷') then 數量 END) AS A銷, SUM(CASE when (區域='A區' and 類型='退') then 數量 END) AS A退, SUM(CASE when (區域='B區' and 類型='發') then 數量 END ) AS B發, SUM(CASE when (區域='B區' and 類型='銷') then 數量 END) AS B銷, SUM(CASE when (區域='B區' and 類型='退') then 數量 END) AS B退 from sunif group by 編號) as tmp; 說明:根據你的數據源,以上語句可以滿足查詢結果。
如果CASE條件有多個會并行顯示,需要適度增加條件 。
如何分析mysql的查詢語句
A、設置索引項,應該是出現在where后面的列,或者連接字句中出現的列;
B、使用唯一索引,索引的基數越大,索引查詢的效果越好,舉例:查詢條件中含有索引字段和非索引字段的時候,會優先走索引篩選出數據,然后在數據中回表過濾沒有走索引的字段,但是Mysql任務,如果索引篩選出的數據量大于20%,會認為此時走索引效果不如全表掃描,繼而放棄索引,走全表掃描來查詢;
C、使用短索引,例如一個屬性200多位,其實索引只要創建前幾位效果會好;
D、最左原則,組合索引中,靈活運用最左前綴;
E、不要過度使用索引,索引會占用空間,影響寫入的速度;
轉載請注明出處華閱文章網 » mysql的查詢語句