电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

MySQL如何優化查詢速度

瀏覽:71日期:2023-10-13 08:48:57

前面章節我們介紹了如何選擇優化的數據類型、如何高效的使用索引,這些對于高性能的MySQL來說是必不可少的。 但這些還完全不夠,還需要合理的設計查詢。 如果查詢寫的很糟糕,即使表結構再合理、索引再合適,也是無法實現高性能的。

談到MySQL性能優化,查詢優化作為優化的源頭,它也是最能體現一個系統是否更快。 本章以及接下來的幾章將會著重講解關于查詢性能優化的內容,從中會介紹一些查詢優化的技巧,幫助大家更深刻地理解MySQL如何真正地執行查詢、究竟慢在哪里、如何讓其快起來,并明白高效和低效的原因何在,這樣更有助于你更好的來優化查詢SQL語句。

本章從“為什么查詢速度這么慢”開始談起,讓你能夠清楚的知道查詢可能會慢在哪些環節,這樣將有助于你更好的優化查詢,做到 心中有數,高人一籌 。

一、慢在哪

真正衡量查詢速度的是響應時間。 如果把查詢看作是一個任務,那么它是由一系列子任務組成的,每個任務都會消耗一定的時間。 如果要優化查詢,實際上要優化其子任務,那么消除其中一些子任務,那么減少子任務的執行次數,要么讓子任務運行的更快。

MySQL在執行查詢的時候,有哪些子任務,哪些子任務花費的時間最多? 這就需要借助一些工具,或者一些方法(如: 執行計劃)對查詢進行剖析,來定位發現究竟慢在哪。

通常來說,查詢的生命周期大致大致可以按照順序來看: 從客戶端到服務器,然后在服務器上進行解析,生成執行計劃,執行,并返回結果給客戶端。 其中,“執行”可以認為是整個生命周期中最重要的階段,這其中包括了大量為了檢索數據到存儲引擎的調用以及調用后的數據處理,包括排序、分組等。

在完成這些任務的時候,查詢需要在不同階段的不同地方花費時間,包括網絡、CPU計算,生成統計信息和執行計劃、鎖等待等操作,尤其是向底層存儲引擎檢索數據的調用操作,這些調用需要在內存操作、CPU操作,還可能會產生大量的上下文切換以及系統調用。

在上述這些操作中,都會消耗大量的時間,其中會存在一些不必要的額外操作,其中有些操作可能被額外地重復執行了很多次、某些操作執行的很慢等等。 這也就是查詢真正可能慢的地方, 優化查詢的目的就是減少和消除這些操作所花費的時間

通過上面的分析,我們對查詢的過程有了整體的了解,能夠清楚的知道查詢可能在哪些地方會存在問題,最終導致整個查詢很慢,為實際查詢優化提供方向。

換言之,查詢優化可以從以下兩個角度來出發:

減少子查詢次數 減少額外、重復的操作

查詢性能低下常見的原因是訪問的數據太多。 在數據量小的時候,查詢速度還不錯,一旦數據量上來,查詢速度將會發生巨變,讓人抓狂、體驗極差。 針對查詢優化方面,可以從以下方面進行排查:

是否查詢了不需要的數據 是否掃描了額外的記錄

二、是否查詢了不需要的數據

在實際查詢中很多時候,會查詢了實際需要的數據,然后這些多余的數據會被應用程序丟棄。 這對MySQL來說是額外的開銷,同時也會消耗應用服務器的CPU和內存資源。一些典型案例如下:

1. 查詢不需要的記錄

這是一個常見的錯誤,常常會誤以為MySQL只會返回需要的數據,實際上MySQL卻是先返回全部結果集再進行計算。

開發者習慣性的先使用SELECT語句查詢大量的結果,然后由應用查詢或者前端展示層再獲取前面的N行數據,例如,在新聞網站中查詢100條記錄,但是只是在頁面上顯示前10條。

最有效的解決方法是需要多少記錄就查詢多少記錄,通常會在查詢后面加上LIMIT,即: 分頁查詢。

2. 多表關聯時返回全部列

如果你想查詢所有在電影Academy Dinosaur中出現的演員,千萬不要按下面的方式來進行查詢:

select * fromt actor ainner join film_actor fa.actorId = a.actorIdinner join film f f.filmId = fa.filmIdwhere fa.title = ’Academy Dinosaur’;

這樣將會返回三張表的全部數據列,而實際需求是要查詢演員信息,正確的寫法應該是:

select a.* fromt actor ainner join film_actor fa.actorId = a.actorIdinner join film f f.filmId = fa.filmIdwhere fa.title = ’Academy Dinosaur’;

3. 總是查詢出全部列

每次看到select *的時候一定要用異樣的目光來審視它,是不是真的需要返回全部數據列?

在大部分情況下,是不需要的。 select *會導致進行全表掃描,會讓優化器無法完成索引掃描這類優化,過多的列還會為服務器帶來額外的I/O、內存和CPU的消耗。 即使真的需要查詢出全部列,應該逐個羅列出全部列而不是*。

4. 重復查詢相同的數據

如果你不太留意,很容易出現這樣的錯誤: 不斷地重復執行相同的查詢,然后每次都返回完全相同的數據。

例如,在用戶評論的地方需要查詢用戶頭像的URL,那么用戶多次評論的時候,可能就會反復來查詢這個數據。 比較好處理方法是,在初次查詢的時候將這個數據緩存起來,后續使用時直接從緩存中取出。

三、是否掃描了額外的記錄

確 定查詢只查詢了需要的數據以后,接下來應該看看查詢過程中是否掃描了過多的數據。 對于MySQL,最簡單衡量查詢開銷的三個指標如下:

響應時間 掃描的行數 返回的行數

沒有哪個指標能夠完全來衡量查詢的開銷,但它們能夠大致反映MySQL內部執行查詢時需要訪問多少數據,并可以大概推算出查詢運行的實際。 這三個指標都會記錄到MySQL的慢日志中,所以 檢查慢日志記錄是找出掃描行數過多查詢的辦法 。

慢查詢: 用于記錄在MySQL中響應時間超過閾值(long_query_time,默認10s)的語句,并會將慢查詢記錄到慢日志中。 可通過變量slow_query_long來開啟慢查詢,默認是關閉狀態,可以將慢日志記錄到表slow_log或文件中,以供檢查分析。

1. 響應時間

響應時間是兩個部分之和: 服務時間和排隊時間。 服務時間是指數據庫處理這個查詢真正花費了多長時間。 排隊時間是指服務器因為等待某些資源而沒有真正執行查詢的時間,可能是等待I/O操作,也可能是等待 行 鎖等等。

在不同類型的應用壓力下,響應時間并沒有什么一致的規律或者公式。 諸如存儲引擎的鎖(表鎖,行鎖),高并發資源競爭,硬件響應等諸多因素都會影響響應時間,所以,響應時間既可能是一個問題的結果也可能是一個問題的原因,不同案例情況不同。

當你看到一個查詢的響應時間的時候,首先需要問問自己,這個響應時間是否是一個合理的值。

2. 掃描的行數和返回的行數

在分析查詢時,查看該查詢掃描的行數是非常有幫助的,在此之上也能夠分析是否掃描了額外的記錄。

對于找出那些糟糕查詢,這個指標可能還不夠完美,因為并不是所有行的訪問代價都是相同的。 較短的行的訪問速度相當快,內存中的行也比磁盤中的行的訪問速度要快的多。

理想的情況下,掃描的行數和返回的行數應該是相同的。 但實際上這種美事并不多,例如在做一個關聯查詢的時候,掃描的行數和對返回的行數的比率通常都很小,一般在1:1和10:1之間,不過有時候這個值也可能非常大。

3. 掃描的行數和訪問類型

在評估查詢開銷的時候,需要考慮一下從表中找到某一行數據的成本。 MySQL有好幾種訪問方式可以查找并返回一行結果。 這些訪問方式可能需要訪問很多行才能返回一條結果,也有些訪問方式可能無需掃描就能返回結果。

在執行計劃EXPLAIN語句中的type列反映了訪問類型。 訪問類型有很多種,從全表掃描到索引掃描,范圍掃描,唯一索引,常數索引等。 這里列的這些,速度是從慢到快,掃描的行數也是從多到少。

如果查詢沒有辦法找到合適的訪問類型,那么解決的最好辦法通常就是增加一個合適的索引,這也是我們之前討論索引的問題。 現在應該明白為什么索引對于查詢優化如此重要了。 索引讓MySQL以最高效,掃描行數最少的方式找到需要的記錄 。

如果發現查詢掃描了大量的數據但只返回少數的行,通常可以嘗試下面的技巧去優化它:

使用索引覆蓋掃描,把所有需要用的列都放到索引中,這樣存儲引擎無需回表獲取對應的行就可以返回結果了。 優化表結構。 例如使用單獨的匯總表來完成查詢。 重寫復雜查詢,讓MySQL優化器能夠以更優化的方式執行這個查詢。

以上就是MySQL如何優化查詢速度的詳細內容,更多關于MySQL優化查詢速度的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 茶叶百科网-茶叶知识与茶文化探讨分享平台| 台式恒温摇床价格_大容量恒温摇床厂家-上海量壹科学仪器有限公司 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 达利园物流科技集团- | 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 屏蔽服(500kv-超高压-特高压-电磁)-徐吉电气 | 拉力机-万能试验机-材料拉伸试验机-电子拉力机-拉力试验机厂家-冲击试验机-苏州皖仪实验仪器有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 耐高温硅酸铝板-硅酸铝棉保温施工|亿欧建设工程 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 学生作文网_中小学生作文大全与写作指导 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | LOGO设计_品牌设计_VI设计 - 特创易 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 工业rfid读写器_RFID工业读写器_工业rfid设备厂商-ANDEAWELL |