一、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系統中的配置文件一般是是my.ini找到[mysqld]下面加上
代碼如下
log-slow-queries = F:/MySQL/log/mysqlslowquery。log
long_query_time = 2
(2)、Linux下啟用MySQL慢查詢
MySQL在Windows系統中的配置文件一般是是my.cnf找到[mysqld]下面加上
代碼如下
log-slow-queries=/data/mysqldata/slowquery。log
long_query_time=2
② mysql性能調優有哪些關鍵點/經驗
使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸。
EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的……等等,等等。
挑一個你的SELECT語句(推薦挑選那個最復雜的,有多表聯接的),把關鍵字EXPLAIN加到前面。你可以使用phpmyadmin來做這個事。然後,你會看到一張表格。下面的這個示例中,我們忘記加上了group_id索引,並且有表聯接:
③ mysql 如何優化以下sql
因不知你表結構什麼的,咱就只論語句的優化:
你這個查詢,可能主要查詢的花銷在你嵌套的子查詢中,
selecttypeno,count(id)ascontfromproctswherelang='en'groupbytypeno
及
selecttypeno,count(id)ascontfromproctswherelang='en'andpubdate=
now()groupbytypeno
建議你將你的子查詢建立臨時表,
然後查詢中使用臨時表替換子查詢,這是最簡單直接的方式
④ mysql 優化sql方法有哪些
1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
3.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5.下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'
若要提高效率,可以考慮全文檢索。
6.in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num
8.應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
9.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id
應改為:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
11.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(...)
13.很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
14.並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。
15.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
⑤ 關於優化mysql中的sql語句
character introcer翻譯過來就是字元引導。也就是針對字元串,顯式的給定一個字元編碼和排序規則,不受系統參數的影響。
總結 Introcer 使用規則:
1. convert 函數
convert 函數類似於 introcer,不過只能指定字元集。
2. charset 函數
檢測字元串的字元集。可以檢測出當前字元串在當前 session 的字元集。
3. set names 語句
語法為:
SETNAMES{'charset_name'[COLLATE 'collation_name'] | DEFAULT}
這條語句最常用,可是也最容易被濫用,比如語句:
set names latin1 collate latin1_bin;
執行後會默認執行一系列語句,也就是把非服務端的相關參數給重新設定了。
SET{CHARACTERSET|CHARSET}{'charset_name' | DEFAULT}
類似語句 set names,同樣是設置以下三個 session 參數:
character_set_results
character_set_client
character_set_connection
4. set character set 語句語法為:
同樣是可以恢復默認值,還有同樣的限制規則等。不過有兩點不同:1)參數 character_set_connection 的值不會被設定為指定的字元集,而是繼承參數 character_set_database 所設定的字元集。
5. collate 子句
collate 語句強制指定排序規則,優先順序最高。也就是顯式指定 collate 會覆蓋已有的排序規則。
這里涉及到單個字元串以及字元串拼接的排序規則問題。
⑥ 怎麼進行mysql資料庫優化
有八個方面可以對mysql進行優化:
1、選取最適用的欄位屬性
MySQL可以很好的支持大數據量的存取,但是一般說來,資料庫中的表越小,在它上面執行的查詢也就會越快。因此,在創建表的時候,為了獲得更好的性能,我們可以將表中欄位的寬度設得盡可能小。
2. 使用連接(JOIN)來代替子查詢(Sub-Queries)
MySQL從4.1開始支持SQL的子查詢。這個技術可以使用SELECT語句來創建一個單列的查詢結果,然後把這個結果作為過濾條件用在另一個查詢中。
3、使用聯合(UNION)來代替手動創建的臨時表
MySQL從4.0的版本開始支持union查詢,它可以把需要使用臨時表的兩條或更多的select查詢合並的一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證資料庫整齊、高效。
4、事務
盡管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯合(UNION)來創建各種各樣的查詢,但不是所有的資料庫操作都可以只用一條或少數幾條SQL語句就可以完成的。更多的時候是需要用到一系列的語句來完成某種工作。但是在這種情況下,當這個語句塊中的某一條語句運行出錯的時候,整個語句塊的操作就會變得不確定起來。設想一下,要把某個數據同時插入兩個相關聯的表中,可能會出現這樣的情況:第一個表中成功更新後,資料庫突然出現意外狀況,造成第二個表中的操作沒有完成,這樣,就會造成數據的不完整,甚至會破壞資料庫中的數據。要避免這種情況,就應該使用事務,它的作用是:要麼語句塊中每條語句都操作成功,要麼都失敗
5、鎖定表
盡管事務是維護資料庫完整性的一個非常好的方法,但卻因為它的獨占性,有時會影響資料庫的性能,尤其是在很大的應用系統中。由於在事務執行的過程中,資料庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務結束。其實,有些情況下我們可以通過鎖定表的方法來獲得更好的性能。
6、使用外鍵
鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵。
7、使用索引
索引是提高資料庫性能的常用方法,它可以令資料庫伺服器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有MAX(),MIN()和ORDERBY這些命令的時候,性能提高更為明顯。
8、優化的查詢語句
絕大多數情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當的話,索引將無法發揮它應有的作用。
⑦ mysql資料庫怎麼優化,有幾方面的優化
我列舉幾個我熟悉的,
1,存儲引擎,根據應用選擇合適的引擎
2,索引
----這個就有很多文章了,具體需要你自己去了解
3,sql語句優化,查詢條件的選擇之類
4,mysql自身系統配置,需要針對應用去定製
5,表的選擇,臨時表,或者分區表,也需要針對應用的情況去選擇使用
⑧ MySQL伺服器如何進行調優
第一種方法時替換有問題的硬體。對MySQL進程的設置進行調優。對查詢進行優化。
替換有問題的硬體通常是我們的第一考慮,主要原因是資料庫會佔用大量資源。不過這種解決方案也就僅限於此了。實際上,您通常可以讓中央處理器(CPU)或磁碟速度加倍,也可以讓內存增大4到8倍。
第二種方法是對MySQL伺服器(也稱為mysqld)進行調優。
對這個進程進行調優意味著適當地分配內存,並讓 mysqld 了解將會承受何種類型的負載。加快磁碟運行速度不如減少所需的磁碟訪問次數。類似地,確保 MySQL 進程正確操作就意味著它花費在服務查詢上的時間要多於花費在處理後台任務(如處理臨時磁碟表或打開和關閉文件)上的時間。對mysqld進行調優是本文的重點。
最好的方法是確保查詢已經進行了優化。這意味著對表應用了適當的索引,查詢是按照可以充分利用MySQL功能的方式來編寫的。盡管本文並沒有包含查詢調優方面的內容(很多著作中已經針對這個主題進行了探討),不過它會配置mysqld來報告可能需要進行調優的查詢。
雖然已經為這些任務指派了次序,但是仍然要注意硬體和mysqld的設置以利於適當地調優查詢。海外伺服器租用機器速度慢也就罷了,我曾經見過速度很快的機器在運行設計良好的查詢時由於負載過重而失敗,因為mysqld被大量繁忙的工作所佔用而不能服務查詢。
第三種方法是記錄慢速查詢
在一個SQL伺服器中,數據表都是保存在磁碟上的。索引為伺服器提供了一種在表中查找特定數據行的方法,而不用搜索整個表。當必須要搜索整個表時,就稱為表掃描。通常來說,您可能只希望獲得表中數據的一個子集,因此全表掃描會浪費大量的磁碟I/O,因此也就會浪費大量時間。當必須對數據進行連接時,這個問題就更加復雜了,因為必須要對連接兩端的多行數據進行比較。
當然,表掃描並不總是會帶來問題;有時讀取整個表反而會比從中挑選出一部分數據更加有效(伺服器進程中查詢規劃器用來作出這些決定)。如果索引的使 用效率很低,或者根本就不能使用索引,則會減慢查詢速度,而且隨著伺服器上的負載和表大小的增加,這個問題會變得更加顯著。執行時間超過給定時間范圍的查詢就稱為慢速查詢。
_深圳比特捷_
⑨ 如何進行SQL性能優化
這里分享下mysql優化的幾種方法。
1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。
⑩ MysqlSql優化疑問1
role的條件用引號括起來,如果a.id是自增的話,可以改成下面的。WHERE c.role = '2' ORDER BY a.id desc
另外,你可以用會員表來作關聯主表試試,即先查會員。