亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

Mysql查詢語句優化技巧

2024-07-24 13:09:18
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Mysql查詢語句優化技巧的相關資料,需要的朋友可以參考下
 

索引優化,查詢優化,查詢緩存,服務器設置優化,操作系統和硬件優化,應用層面優化(web服務器,緩存)等等。這里的記錄的優化技巧更適用于開發人員,都是從網絡上收集和自己整理的,主要是查詢語句上面的優化,其它層面的優化技巧在此不做記錄。

查詢的開銷指標:

執行時間

檢查的行數

返回的行數

建立索引的幾個準則:

(1)、合理的建立索引能夠加速數據讀取效率,不合理的建立索引反而會拖慢數據庫的響應速度。

(2)、索引越多,更新數據的速度越慢。

(3)、盡量在采用MyIsam作為引擎的時候使用索引(因為MySQL以BTree存儲索引),而不是InnoDB。但MyISAM不支持

Transcation。

(4)、當你的程序和數據庫結構/SQL語句已經優化到無法優化的程度,而程序瓶頸并不能順利解決,那就是應該考慮使用諸如memcached這樣的分布式緩存系統的時候了。

(5)、習慣和強迫自己用EXPLAIN來分析你SQL語句的性能。

一、count的優化

比如:計算id大于5的城市

select count(*) from world.city where id > ;select (select count() from world.city) – count() from world.city where id <= ;

a語句當行數超過11行的時候需要掃描的行數比b語句要多, b語句掃描了6行,此種情況下,b語句比a語句更有效率。當沒有where語句的時候直接select count(*) from world.city這樣會更快,因為mysql總是知道表的行數。

二、避免使用不兼容的數據類型

例如float和int、char和varchar、binary和varbinary是不兼容的。數據類型的不兼容可能使優化器無法執行一些本來可以進行的優化操作。

在程序中,保證在實現功能的基礎上,盡量減少對數據庫的訪問次數;通過搜索參數,盡量減少對表的訪問行數,最小化結果集,從而減輕網絡負擔;能夠分開的操作盡量分開處理,提高每次的響應速度;在數據窗口使用SQL時,盡量把使用的索引放在選擇的首列;算法的結構盡量簡單;在查詢時,不要過多地使用通配符如 SELECT * FROM T1語句,要用到幾列就選擇幾列如:SELECT COL1,COL2 FROM T1;在可能的情況下盡量限制盡量結果集行數如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因為某些情況下用戶是不需要那么多的數據的。不要在應用中使用數據庫游標,游標是非常有用的工具,但比使用常規的、面向集的SQL語句需要更大的開銷;按照特定順序提取數據的查找。

三、索引字段上進行運算會使索引失效

盡量避免在WHERE子句中對字段進行函數或表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

SELECT * FROM T1 WHERE F1/2=100 應改為: SELECT * FROM T1 WHERE F1=100*2

四、避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等這樣的操作符

因為這會使系統無法使用索引,而只能直接搜索表中的數據。例如: SELECT id FROM employee WHERE id != “B%” 優化器將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行。在in語句中能用exists語句代替的就用exists.

五、盡量使用數字型字段

一部分開發人員和數據庫管理人員喜歡把包含數值信息的字段

設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接回逐個比較字符串中每一個字符,而對于數字型而言只需要比較一次就夠了。

六、合理使用EXISTS,NOT EXISTS子句

如下所示:

 SELECT SUM(T1.C1) FROM T1 WHERE (SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0) SELECT SUM(T1.C1) FROM T1WHERE EXISTS(SELECT * FROM T2 WHERE T2.C2=T1.C2)

兩者產生相同的結果,但是后者的效率顯然要高于前者。因為后者不會產生大量鎖定的表掃描或是索引掃描。如果你想校驗表里是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費服務器資源。可以用EXISTS代替。如:

IF (SELECT COUNT() FROM table_name WHERE column_name = ‘xxx')可以寫成:IF EXISTS (SELECT FROM table_name WHERE column_name = ‘xxx')

七、 能夠用BETWEEN的就不要用IN

八、 能夠用DISTINCT的就不用GROUP BY

九、盡量不要用SELECT INTO語句

SELECT INTO 語句會導致表鎖定,阻止其他用戶訪問該表

十、 必要時強制查詢優化器使用某個索引

SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45) 改成:SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND processid IN (8,32,45)

則查詢優化器將會強行利用索引IX_ProcessID 執行查詢。

十一、消除對大型表行數據的順序存取

盡管在所有的檢查列上都有索引,但某些形式的WHERE子句強迫優化器使用順序存取。如:

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

解決辦法可以使用并集來避免順序存取:

SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 UNION SELECT * FROM orders WHERE order_num=1008

這樣就能利用索引路徑處理查詢?!緅acking 數據結果集很多,但查詢條件限定后結果集不大的情況下,后面的語句快】

十二、盡量避免在索引過的字符數據中,使用非打頭字母搜索。

這也使得引擎無法利用索引

見如下例子:

SELECT * FROM T1 WHERE NAME LIKE ‘%L%'SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)='L'SELECT * FROM T1 WHERE NAME LIKE ‘L%'

即使NAME字段建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不對全表所有數據逐條操作來完成任務。而第三個查詢能夠使用索引來加快操作,不要習慣性的使用 ‘%L%'這種方式(會導致全表掃描),如果可以使用`L%'相對來說更好;

十三、雖然UPDATE、DELETE語句的寫法基本固定,但是還是對UPDATE語句給點建議

(1). 盡量不要修改主鍵字段。

(2). 當修改VARCHAR型字段時,盡量使用相同長度內容的值代替。

(3). 盡量最小化對于含有UPDATE觸發器的表的UPDATE操作。

(4). 避免UPDATE將要復制到其他數據庫的列。

(5). 避免UPDATE建有很多索引的列。

(6). 避免UPDATE在WHERE子句條件中的列。

十四、能用UNION ALL就不要用UNION

UNION ALL不執行SELECT DISTINCT函數,這樣就會減少很多不必要的資源

在跨多個不同的數據庫時使用UNION是一個有趣的優化方法,UNION從兩個互不關聯的表中返回數據,這就意味著不會出現重復的行,同時也必須對數據進行排序,我們知道排序是非常耗費資源的,特別是對大表的排序。

UNION ALL可以大大加快速度,如果你已經知道你的數據不會包括重復行,或者你不在乎是否會出現重復的行,在這兩種情況下使用UNION ALL更適合。此外,還可以在應用程序邏輯中采用某些方法避免出現重復的行,這樣UNION ALL和UNION返回的結果都是一樣的,但UNION ALL不會進行排序。

十五、字段數據類型優化

(1). 避免使用NULL類型:NULL對于大多數數據庫都需要特殊處理,MySQL也不例外,它需要更多的代碼,更多的檢查和特殊的索引邏輯,有些開發人員完全沒有意識到,創建表時NULL是默認值,但大多數時候應該使用NOT NULL,或者使用一個特殊的值,如0,-1作為默認值。

(2). 盡可能使用更小的字段,MySQL從磁盤讀取數據后是存儲到內存中的,然后使用cpu周期和磁盤I/O讀取它,這意味著越小的數據類型占用的空間越小,從磁盤讀或打包到內存的效率都更好,但也不要太過執著減小數據類型,要是以后應用程序發生什么變化就沒有空間了。修改表將需要重構,間接地可能引起代碼的改變,這是很頭疼的問題,因此需要找到一個平衡點。

(3). 優先使用定長型

十七、關于大數據量limit分布的優化(當偏移量特別大時,limit效率會非常低)

附上一個提高limit效率的簡單技巧,在覆蓋索引(覆蓋索引用通俗的話講就是在select的時候只用去讀取索引而取得數據,無需進行二次select相關表)上進行偏移,而不是對全行數據進行偏移??梢詫母采w索引上提取出來的數據和全行數據進行聯接,然后取得需要的列,會更有效率,看看下面的查詢:

mysql> select film_id, description from sakila.film order by title limit 50, 5;

如果表非常大,這個查詢最好寫成下面的樣子:

mysql> select film.film_id, film.description from sakila.filminner join(select film_id from sakila.film order by title liimit 50,5) as film usinig(film_id);

十八、程序中如果一次性對同一個表插入多條數據

比如以下語句:

insert into person(name,age) values(‘xboy', 14);insert into person(name,age) values(‘xgirl', 15);insert into person(name,age) values(‘nia', 19);

把它拼成一條語句執行效率會更高.

insert into person(name,age) values(‘xboy', 14), (‘xgirl', 15),(‘nia', 19);

十九、不要在選擇的欄位上放置索引,這是無意義的。

應該在條件選擇的語句上合理的放置索引,比如where,order by

SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;

上面這個語句,你在id/title/content上放置索引是毫無意義的,對這個語句沒有任何優化作用。但是如果你在外鍵cat_id上放置一個索引,那作用就相當大了。

二十、ORDER BY語句的MySQL優化

(1). ORDER BY + LIMIT組合的索引優化。如果一個SQL語句形如:

SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];

這個SQL語句優化比較簡單,在[sort]這個欄位上建立索引即可。

(2). WHERE + ORDER BY + LIMIT組合的索引優化,形如:

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [VALUE] ORDER BY [sort] LIMIT [offset],[LIMIT];

這個語句,如果你仍然采用第一個例子中建立索引的方法,雖然可以用到索引,但是效率不高。更高效的方法是建立一個聯合索引(columnX,sort)

(3). WHERE + IN + ORDER BY + LIMIT組合的索引優化,形如:

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] IN ([value1],[value2],…) ORDER BY [sort] LIMIT [offset],[LIMIT];

這個語句如果你采用第二個例子中建立索引的方法,會得不到預期的效果(僅在[sort]上是using index,WHERE那里是using where;using filesort),理由是這里對應columnX的值對應多個。

目前哥還木有找到比較優秀的辦法,等待高手指教。

(4).WHERE+ORDER BY多個欄位+LIMIT,比如:

SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;

對于這個語句,大家可能是加一個這樣的索引:(x,y,uid)。但實際上更好的效果是(uid,x,y)。這是由MySQL處理排序的機制造成的。



注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人精品久久一区二区三区| 国产精品视频区| 久久成人人人人精品欧| 国产手机视频精品| 2019最新中文字幕| 国产精品国模在线| 情事1991在线| 久久精品一区中文字幕| 色综合久久88色综合天天看泰| 九九久久久久久久久激情| 亚洲欧美激情另类校园| 中文字幕视频一区二区在线有码| 一本色道久久综合狠狠躁篇的优点| 日韩在线一区二区三区免费视频| 91免费人成网站在线观看18| 在线丨暗呦小u女国产精品| 7m精品福利视频导航| 亚洲黄色免费三级| 久久91亚洲人成电影网站| 丰满岳妇乱一区二区三区| 免费91麻豆精品国产自产在线观看| 国产精品揄拍一区二区| 日韩欧美亚洲一二三区| 中文字幕精品一区二区精品| 久久影视电视剧凤归四时歌| 日韩在线欧美在线| 国产亚洲精品日韩| 中文字幕在线看视频国产欧美| 国产精品美女免费视频| 国产欧美精品一区二区三区介绍| 一本色道久久88综合日韩精品| 国产精品xxx视频| 亚洲人成电影网站色xx| 在线电影av不卡网址| 日本久久久久久久久| 亚洲人成在线电影| 精品美女永久免费视频| 日韩中文在线中文网在线观看| 亚洲的天堂在线中文字幕| 国产亚洲精品久久久久动| 久久免费观看视频| 日韩欧美在线观看视频| 精品久久久一区| 国产一区二区三区在线看| 色老头一区二区三区在线观看| 日韩高清av一区二区三区| 日韩欧美国产成人| 国产亚洲精品va在线观看| 欧美极品美女电影一区| 国产精品美乳在线观看| 欧美极度另类性三渗透| 91精品啪在线观看麻豆免费| 亚洲国产天堂网精品网站| 中文字幕日韩免费视频| 亚洲自拍偷拍色图| 久久久国产成人精品| 精品国产成人在线| 成人免费网视频| 中文字幕免费国产精品| 欧美激情欧美激情在线五月| www.欧美视频| 中文字幕在线视频日韩| 亚洲欧美日韩视频一区| 日韩美女免费观看| 2019国产精品自在线拍国产不卡| 欧美极品少妇xxxxx| 亚洲精品国产精品久久清纯直播| 亚洲美女免费精品视频在线观看| 高清一区二区三区四区五区| 免费91麻豆精品国产自产在线观看| 欧美精品成人91久久久久久久| 91美女片黄在线观| 国产精品亚洲第一区| 亚洲精品成人久久| 在线日韩日本国产亚洲| 日韩在线中文字幕| 91久久精品日日躁夜夜躁国产| 国产做受69高潮| 欧美成人精品激情在线观看| 日韩av网址在线观看| 亚洲午夜色婷婷在线| 国产精品久久视频| 日韩福利在线播放| 91精品国产一区| 国产亚洲日本欧美韩国| 欧美一区二区三区四区在线| 亚洲福利影片在线| 欧美一级大胆视频| 成人在线小视频| 日韩精品在线免费播放| 久久久久久久一区二区三区| 少妇高潮久久久久久潘金莲| 国产精品高清免费在线观看| 成人国内精品久久久久一区| 欧美日韩综合视频网址| 中文字幕亚洲欧美一区二区三区| 欧美在线视频一区| 欧日韩在线观看| 这里只有精品久久| 国产综合色香蕉精品| 狠狠躁夜夜躁久久躁别揉| 91精品久久久久久久久久| 欧美午夜www高清视频| 欧美丰满少妇xxxx| 国产免费一区二区三区香蕉精| 国产精品99蜜臀久久不卡二区| 日韩国产欧美精品一区二区三区| 91在线直播亚洲| 日韩中文在线中文网三级| 久久精品影视伊人网| 亚洲精品美女免费| 亚洲精选一区二区| 欧美成人午夜剧场免费观看| 孩xxxx性bbbb欧美| 日韩精品视频在线播放| 国产一区视频在线播放| 亚洲美女av网站| 日本免费久久高清视频| 成人www视频在线观看| 色久欧美在线视频观看| 亚洲一级免费视频| 国内精品久久影院| 97成人超碰免| 亚洲国产一区二区三区在线观看| 伊人久久久久久久久久| 国产精品久久久久aaaa九色| 免费av在线一区| 中文字幕亚洲一区二区三区五十路| 亚洲第一综合天堂另类专| 日韩欧美亚洲国产一区| 国产精品综合久久久| 影音先锋日韩有码| 中文在线资源观看视频网站免费不卡| 久久亚洲精品中文字幕冲田杏梨| 日韩在线中文字| 一区二区三区精品99久久| 日韩国产精品视频| 日本高清久久天堂| 精品成人69xx.xyz| 亚洲天堂av网| 最近日韩中文字幕中文| 国产精品91久久| 久久的精品视频| 欧美亚洲另类制服自拍| 青青草一区二区| 国产精品扒开腿做爽爽爽的视频| 欧美不卡视频一区发布| 97超级碰碰碰久久久| 亚洲精品91美女久久久久久久| 久久亚洲综合国产精品99麻豆精品福利| 亚洲成人精品久久久| 欧美国产亚洲视频| 国产精品视频中文字幕91| 久久精品99久久久久久久久| 亚洲欧美日韩天堂| 亚洲精品视频中文字幕| 国内精品小视频在线观看| 欧美成人精品一区二区三区| 九九九热精品免费视频观看网站| 国产亚洲精品成人av久久ww| 亚洲激情成人网| 精品亚洲一区二区三区在线观看| 国产丝袜高跟一区| 国产在线播放不卡|