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

打造出色查詢:如何優化SQL查詢?

數據庫 MySQL
我們致力于打造能夠較好運行并延續較長一段時間的query(查詢)。本文將給出關于優化SQL語句的幾點建議,希望能夠幫到你。

本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。

我們致力于打造能夠較好運行并延續較長一段時間的query(查詢)。本文將給出關于優化SQL語句的幾點建議,希望能夠幫到你。

[[333301]]

1. 嘗試不去用select *來查詢SQL,而是選擇專用字段。

反例:

  1. select * from employee; 

正例:

  1. select id,name fromemployee; 

理由:

  • 通過只用必要字段進行查詢,能夠節省資源并減少網絡開銷。
  • 這樣做可能不會使用覆蓋索引,會導致一個查詢返回到表中。

2. 如果已知只有一個查詢結果,推薦使用limit 1

假設有一張員工表格,想在其中找到一名叫jay的員工。

  1. CREATE TABLE employee ( 
  2. id int(11) NOT NULL, 
  3. name varchar(255) DEFAULT NULL, 
  4. age int(11) DEFAULT NULL, 
  5. date datetime DEFAULT NULL, 
  6. sex int(1) DEFAULT NULL, 
  7. PRIMARY KEY (`id`) ); 

反例:

  1. select id,name from employeewhere name='jay'

正例:

  1. select id,name from employeewhere name='jay' limit 1; 

理由:添加limit 1后,查找到相應的記錄時,便不會繼續查找下去,效率會大大提高。

3. 嘗試避免在 where 子句中使用or來連接條件

創建一個新的用戶表格,其有一個常規索引userId,表格結構如下:

  1. CREATE TABLE `user` ( 
  2.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  3.   `userId` int(11) NOT NULL, 
  4.   `age` int(11) NOT NULL, 
  5.   `name` varchar(255) NOT NULL, 
  6.   PRIMARY KEY (`id`), 
  7.   KEY `idx_userId` (`userId`) ) 

現在假設需要查詢userid為1或為18歲的用戶,使用如下的SQL就會很簡單。

反例:

  1. select * from user where userid = 1 or age = 18

正例:

  1. //se union all 
  2. select * from user where userid=1 
  3. union all 
  4. select * from user where age = 18;//Or write two separate SQL 
  5. select * from user where userid=1

理由:or 的使用可能會使索引無效,因此需要進行全表掃描。

在or 無索引的情況下,假設已采用userId索引,但是當涉及到 age(年齡)查詢條件時,必須執行全表掃描,其過程分為三步:全表掃描+索引掃描+合并。

 

[[333302]]

 

 

圖源:unsplash

 

4. 盡可能避免在where子句中使用!=或<>運算符,否則,引擎將放棄使用索引并執行全表掃描。

反例:

  1. select age,name from user where age<>18; 

正例:

  1. //You can consider separate two sql writeselect age,name from user where age <18
  2. select age,name from user where age>18; 

理由:使用!=和<>可能使索引無效。

5. 優化limit分頁

通常用limits來實現日常分頁,但當偏移量特別大時,查詢效率便會降低。因為Mysql不會跳過偏移量,而是直接獲取數據。

反例:

  1. select id,name,age from employeelimit 10000,10; 

正例:

  1. //Solution 1: Return the largest record (offset) of the last query 
  2. select id,name from employeewhere id>10000 limit 10;//Solution 2: order by + index 
  3. select id,name from employeeorder by id limit 10000,10; 

理由:

  • 如果使用了優化方案1,則會返回最末的查詢記錄(偏移量),因此可以跳過該偏移量,效率自然會大幅提高。
  • 選項二:使用+索引排序,也可以提高查詢效率。

6. 優化like語句

在日常開發中,如果使用模糊關鍵字查詢,我們很容易想到like,但like可能會使索引無效。

反例:

  1. select userId,name from user where userId like '%123'; 

正例:

  1. select userId,name from user where userId like '123%'; 

理由:https://medium.com/@pawanjain.432/hey-thanks-dovid-for-pointing-out-a-typo-in-13-1000a4103fe6

7. 使用where條件限制將要查詢的數據來避免返回額外行

假設要查詢一名用戶是否為會員,老式執行代碼會這樣做。

反例:

  1. List<Long> userIds = sqlMap.queryList("select userId from userwhere isVip=1");boolean isVip = userIds.contains(userId); 

正例:

  1. Long userId = sqlMap.queryObject("select userId from user whereuserId='userId' and isVip='1' ")boolean isVip = userId!=null; 

理由:能夠檢查需要的數據,避免返回非必要數據,并能節省費用和計算機開銷。

 

[[333303]]

 

 

圖源:unsplash

 

8. 考慮在where子句中使用默認值而不是null

反例:

  1. select * from user where age is not null; 

正例:

  1. select * from user where age>0; //Set 0 as default 

理由:如果用默認值取代null值,則通常可以建立索引,與此同時,表達式將相對清晰。

9. 如果插入數據過多,可以考慮批量插入

反例:

  1. for(User 
  2.     u :list){ 
  3. INSERT into user(name,age)values(#name#,#age#) 

正例:

  1. //One batch of 500 inserts, carried out in batchesinsert intouser(name,age) values 
  2. <foreach collection="list" item="item"index="index" separator=","> 
  3.     (#{item.name},#{item.age}) 
  4. </foreach> 

理由:批量插入性能良好且省時。

打個比方,在有電梯的情況下,你需要將1萬塊磚移送到建筑物的頂部。電梯一次可以放置適當數量的磚塊(最多500塊),你可以選擇一次運送一塊磚,也可以一次運送500塊。哪種方案更好?

10. 謹慎使用distinct關鍵詞

Distinct關鍵詞通常用于過濾重復記錄以返回唯一記錄。當其被用于查詢一個或幾個字段時,Distinct關鍵詞將為查詢帶來優化效果。然而,在字段過多的情況下,Distinct關鍵詞將大大降低查詢效率。

反例:

  1. SELECT DISTINCT * from user; 

正例:

  1. select DISTINCT name from user; 

理由:帶有“distinct”語句的CPU時間和占用時間高于沒有“ distinct”的語句。

如果在查詢多字段時使用distinct,數據庫引擎將比較數據,并濾除重復的數據。然而,該比較和濾除過程將消耗系統資源和CPU時間。

 

打造出色查詢:如何優化SQL查詢?

 

 

圖源:unsplash

 

11. 刪除多余和重復的索引

反例:

  1. KEY `idx_userId` (`userId`) 
  2. KEY `idx_userId_age` (`userId`,`age`) 

正例:

  1. //Delete the userId index, because the combined index (A, B) is equivalentto creating the (A) and (A, B) indexesKEY `idx_userId_age` (`userId`,`age`) 

理由:若保留重復的索引,那么優化程序在優化查詢時也需要對其進行一一考量,這會影響性能。

12. 如果數據量很大,優化 modify或delete語句

避免同時修改或刪除過多數據,因其將導致CPU利用率過高,從而影響他人對數據庫的訪問。

反例:

  1. //Delete 100,000 or 1 million+ at a time? 
  2. delete from user where id <100000;//Or use single cycle operation, lowefficiency and long time 
  3. for(User user:list){ 
  4.    delete from user;} 

正例:

  1. //Delete in batches, such as 500 each timedelete user where id<500
  2. delete product where id>=500 and id<1000; 

理由:一次刪除過多數據,可能會導致lock wait timeout exceed error(鎖定等待超時錯誤),因此建議分批操作。

13. 使用explain分析SQL方案

在日常開發中編寫SQL時,嘗試養成習慣:使用explain來分析自己編寫的SQL,尤其是索引。

  1. explain select * from user where userid = 10086 or age =18

14. 嘗試用union all代替union

如果搜索結果里沒有重復的記錄,我推薦用union all代替union。

反例:

  1. select * from user where userid=1 
  2. union 
  3. select * from user where age = 10 

正例:

  1. select * from user where userid=1 
  2. union all 
  3. select * from user where age = 10 

理由:

  • 如果使用union,則無論有沒有重復的搜索結果,它都會嘗試對其進行合并、排序,然后輸出最終結果。
  • 若已知搜索結果中沒有重復記錄,用union all代替union將提高效率。

15. 盡可能使用數字字段。如果字段僅包含數字信息,嘗試不將其設置為字符類型。

反例:

  1. `king_id` varchar(20) NOT NULL; 

正例:

  1. `king_id` int(11) NOT NULL; 

理由:與數字字段相比,字符類型將降低查詢和連接的性能,并會增加存儲開銷。

16. 盡可能用varchar或nvarchar代替char或nchar

反例:

  1. `deptName` char(100) DEFAULT NULL 

正例:

  1. `deptName` varchar(100) DEFAULT NULL 

理由:

  • 首先,由于可變長度字段的存儲空間很小,該方法可以節省存儲空間。
  • 其次,對于查詢而言,在相對較小的字段中搜索會更有效率。

優化和加速SQL查詢是門技術活,常常思考和嘗試,你會打開新世界的大門。

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2024-11-05 08:28:50

2024-06-11 08:00:00

2015-05-08 09:47:35

2013-12-10 09:00:51

WindowsLinux開發環境

2017-06-07 08:54:47

APM儀表板Lombok設計框架

2010-10-28 10:26:56

求職

2016-03-02 10:27:16

Python定制化Eclipse IDE

2024-09-24 13:31:14

2024-09-26 21:44:29

2023-04-12 07:25:55

2017-04-13 09:56:57

0分貝主機風扇

2022-05-31 08:53:29

Logger定制化Go

2016-10-17 20:54:34

Web技術堆棧編程語言

2016-12-15 09:58:26

優化SQL高性能

2017-07-12 13:04:23

數據庫SQL查詢執行計劃

2020-10-09 10:15:22

谷歌機器人輔助機器人

2022-04-12 15:05:22

機器人研究人工智能

2011-08-30 22:50:13

D-LinkDNS-320
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费在线播放 | 欧美理论片在线 | 亚洲成人一区二区 | 日韩高清中文字幕 | 亚洲一区久久 | 国产免费自拍 | 国产精品免费看 | 国产精品嫩草影院精东 | 成人午夜网 | 久久成人精品视频 | 在线播放亚洲 | 天天操天天插天天干 | 欧美黑人激情 | 亚洲精品在线看 | 久久久影院 | 成人欧美一区二区三区 | 激情视频中文字幕 | 国产精品久久一区二区三区 | 国产精品日产欧美久久久久 | av手机免费在线观看 | 中文字幕电影在线观看 | 黄色成人国产 | 欧美精品一区在线发布 | 午夜国产 | 久久黄网| 亚洲大片| 99成人精品 | 欧美一级片久久 | 成年人在线观看 | 成人在线观看中文字幕 | 国产一级免费视频 | 精品成人av | 365夜爽爽欧美性午夜免费视频 | 欧美a级成人淫片免费看 | 99久久精品国产毛片 | 久久av网 | 999久久久 | 成人免费观看视频 | 免费人成在线观看网站 | 91在线一区二区 | 国内久久 |