成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL查詢語句很慢?可以試試幾種SQL優化

數據庫 MySQL
無論什么數據庫,多表連接的查詢成本都是比較高的,因此對于高并發應用,應該盡量減少有連接的查詢,多表連接的個數不要超過4張表。一般數據量少的時候,連接開小不大,一般不會有性能問題,當數據量變大后,那么性能問題就會比較突出。

MySQL查詢語句很慢?可以試試幾種SQL優化

連接查詢的優化

無論什么數據庫,多表連接的查詢成本都是比較高的,因此對于高并發應用,應該盡量減少有連接的查詢,多表連接的個數不要超過4張表。一般數據量少的時候,連接開小不大,一般不會有性能問題,當數據量變大后,那么性能問題就會比較突出。所以在數據庫初期最好能確定哪個表能成為大表,然后進行反范式設計減少連接的表,例如增加冗余字段等等,或者在業務代碼中進行連接計算。

一些經驗總結點:

1、ON、USING字句中的列確認有索引,如果連接的順序為B、A,那么只需在A表的列上創建索引即可,無需在B中建索引,可以減少不必要索引開銷。

查詢舉例:

  1. SELECT B.*,A.* FROM B JOIN A ON B.col1 = A.col2 

MYSQL會全表掃描B表,對B表的每一行記錄去尋找A表記錄,所以需用A表COL2列上索引來提高效率。

2、使用EXPLAIN 檢查連接,看ROWS列,如果該列值太高,比如幾千,上萬的,那么就需要考慮是否索引無效后者連接表的順序不對了。

3、考慮在應用層實現連接查詢,例如可以在JAVA中把復雜的查詢分解為幾個簡單查詢,得到一個較小的結果集合,處理遍歷后,再根據條件獲取完整數據,這樣做往往更高效,因為把數據分離,更不容易變化,有利于數據庫緩存數據。

舉例如下:

  1. SELECT a.* FROM A WHERE a.id IN(1,2,3,4,5,6,7,8,9,10); 

如果id=1~8的記錄已經被存儲在緩存REDIS中了,那么我們只需要查詢id=9和10的數據,這樣減少了很多數據庫連接交互,可以提高性能。

GROUP BY、DISTINCT、ORDER BY 語句優化

這些語句默認都要進行ORDER BY排序,優化的思路比較類似。

1、如果多張表進行連接查詢,ORDER BY 的列應屬于連接順序的第一張表。如果不在同一個表中,那么可以考慮冗余一些列,或者合并表。

2、需要保證索引列和ORDER BY的列相同,且各列按照相同的方向進行排序。

3、指定ORDER BY NULL,默認情況下,MYSQL將排序所有GROUP BY的查詢,如果想要避免排序結果所產生的消耗,可以指定ORDER BY NULL。

舉例如下:

  1. select count(1) from sys_dept group by dept_id order by null limit 3 

子查詢優化

由于子查詢可讀性比較符合開發人員的思路習慣,所以都習慣編寫子查詢,但子查詢在生產環境中,是最常見的性能瓶頸。

對于數據庫來說,大部分情況下,連接比子查詢更快,優化器一般可以生成更佳的執行計劃,可以余弦裝載數據,更高效的處理查詢,子查詢生成的臨時表也沒有索引,因此效率會更低。

目前的實踐來說,子查詢應該盡量改寫成JOIN的寫法

舉個常見的例子

  1. SELECT c1 FROM t1 where t1.c1 IN (SELECT c1 FROM t2); 

我們可以轉化為連接的方式:

  1. SELECT c1 FROM t1.c1 FROM t1,t2 WHERE t1.c1=t2.c2 

優化IN列表

對于IN列表,MySQL會排序里面的值,并使用二分查找方式去定位數據,把IN字句改寫成OR形式其實沒什么用。IN列表不建議太長,對于高并發業務,建議不超過幾十個。優化思路可以轉化為多個等于的查詢。例如下面的語句,如果ID值很多,其實性能不會太好。

  1. SELECT * FROM A where A.ID IN(SELECT id FROM B) 

優化思路:

可以從程序業務層出發,先查詢SELECT id FROM B,然后獲取到ID的值,逐步和 SELECT * FROM A進行拼接,轉化為 SELECT * FROM A where ID =?的形式。

優化UNION

UNION語句默認是去除重復記錄,需要用到排序操作,如果結果集很大,成本會很高,建議盡量使用UNION ALL 語句,對于UNION多個分表場景,應盡可能在數據庫分表的時候,就確定各個分表數據唯一性,這樣就無需使用UNION來去重了。

另外查詢語句外的WHERE條件并不會應用到每個單獨的UNION子句中,所以每個UNION子句都添加where條件。

優化BLOB、TEXT類型字段的查詢

由于mysql內存臨時表暫不支持BLOB、TEXT類型,如果包含他們的查詢就要用到基于磁盤的臨時表,性能會很低,所以如無必要,查詢條件就不要這2種類型。

優化思路:

1、如果必須使用,可以考慮拆分表,把BLOB、TEXT字段分離到單獨的表中。

2、如果有許多大字段,可以考慮合并這些字段到一個字段,存儲一個大200KB比存儲20個10KB更有效。

3、考慮使用COMPRESS(),再存儲。 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2018-03-29 19:45:47

數據庫MySQL查詢優化

2023-11-30 15:37:37

MySQL數據庫

2019-08-14 15:18:55

MySQLSQL數據庫

2011-05-26 13:26:42

if

2016-12-15 09:58:26

優化SQL高性能

2017-07-12 13:04:23

數據庫SQL查詢執行計劃

2011-06-28 08:32:40

MySQL慢查詢日志

2011-03-31 11:14:51

Sql語句優化

2017-09-01 21:00:05

MySQLSQL優化查詢方法

2020-06-17 09:15:57

MySQLSQL數據庫

2009-04-28 09:38:53

SQL優化物理查詢

2022-09-01 16:42:47

MySQL數據庫架構

2009-04-09 13:14:09

Oracle分頁查詢CBO

2018-05-14 10:50:13

SQL查詢語句神經網絡

2009-01-14 09:28:12

OracleSQL10g

2023-09-25 13:15:50

SQL數據庫

2010-06-12 15:31:04

MySQL查詢優化

2010-05-14 14:12:58

MySQL數據庫優化

2010-04-13 15:04:16

Oracle優化

2012-07-03 10:26:30

SQL語句優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中国一级大毛片 | 看a级黄色毛片 | 久久久免费电影 | 午夜免费在线 | 久热精品在线观看视频 | 亚洲成av人片在线观看 | 日韩精品久久久久久 | 538在线精品 | 中文字幕在线视频免费视频 | 在线视频一区二区 | 中文字字幕一区二区三区四区五区 | 九色av | 亚洲免费福利视频 | 国产精品中文字幕在线 | 中文字幕a√ | 亚洲成人一二区 | 免费一区二区三区 | 欧美日一区二区 | 日韩视频―中文字幕 | 国产免费让你躁在线视频 | 国产欧美久久一区二区三区 | www.日日干 | 欧美成人免费在线视频 | 97久久超碰| 天天插天天搞 | 久久伊人操| 欧美精品1区 | 美女爽到呻吟久久久久 | 欧美一区二区在线免费观看 | 亚洲一区成人 | 青青久久 | 国产精品久久国产精品久久 | 精品国模一区二区三区欧美 | 久热国产精品视频 | 成人在线小视频 | 久久亚洲一区二区 | 日本久久久久久 | 老外几下就让我高潮了 | 久久一区二 | 精品欧美一区免费观看α√ | 亚洲成年影院 |