淺談MySQL之select優(yōu)化方案
生活中的例子
我們是否看到過在公司中許多查詢語句都是select * xxxx
心中的想法肯定是,別人寫了select *,那我寫吧,省去了不少麻煩事兒
慢查詢
- 首先去思考,最基本的,是否我們使用的數(shù)據(jù)庫插查詢語句存在了訪問的數(shù)據(jù)太多
- 其實(shí)大部分性能低的查詢往往都可以通過減少訪問的數(shù)據(jù)量來優(yōu)化的
- 因?yàn)閟elect * 會(huì)給服務(wù)器帶來額外的I/O、內(nèi)存和cpu的消耗
數(shù)據(jù)庫中慢查詢開銷的三個(gè)指標(biāo)
- 相應(yīng)時(shí)間
- 掃描的行數(shù)
- 返回的行數(shù)
如果走了索引
select * from stu where id = 1;
索引會(huì)優(yōu)化查詢,只返回十條數(shù)據(jù)
如果沒有id索引,那么就會(huì)預(yù)估訪問上百上千行數(shù)據(jù)
tips: 通過mysql中的EXPLAIN命令去查看的其中rows對(duì)應(yīng)的行數(shù)
其實(shí)最好的情況就是在存儲(chǔ)引擎層過where濾掉不匹配的記錄
其次好的情況是覆蓋索引命中掃描,在服務(wù)器層where濾掉不匹配的記錄,不需要回表查詢
最的情況是從數(shù)據(jù)表返回?cái)?shù)據(jù),然后再過濾不滿足條件的記錄
如何去優(yōu)化
使用索引覆蓋,把我們需要的列都放在索引中,這樣我們就避免了回表去查詢
可以單獨(dú)分出來表
3.重構(gòu)查詢(可以進(jìn)行大的查詢化解成小的查詢)
舉例: 如count、limit、max()
count
count 最好的優(yōu)化就是增加匯總表,因?yàn)閏ount不可避免需要掃描大量的行
limit
limit我們在做分頁的時(shí)候很常用,如下面代碼
select id from stu order by id limit 1000,20;
這條語句會(huì)查詢1020條數(shù)據(jù)然后丟掉前一千條返回1000~1020的二十條數(shù)據(jù)
那么優(yōu)化的最好的方式就是走索引,這樣limit查詢查就能變成已知位置的查詢
最大值最小值min&max
首先我們試想如果走的是主鍵索引,那么我們?nèi)ゲ樵兊臅r(shí)候第一個(gè)的值就是我們要返回的最小值
我們也可以走主鍵索引以后,用limit去控制數(shù)據(jù)量,這樣就實(shí)現(xiàn)了min()函數(shù)的效果,從而替換掉min
select id from stu use index(primay) where address = 'bj' limit 1;
這樣就盡可能掃描了少的記錄數(shù)
最后我們來做兩道題放松一下吧
找出`Employee` 表中第二高的薪水(Salary) +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 結(jié)果 +---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+ 解答 select max(Salary) SecondHighestSalary from Employee where salary < (select max(salary) from Employee)
查找 `Person` 表中所有重復(fù)的電子郵箱。 +----+---------+ | Id | Email | +----+---------+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | +----+---------+ 結(jié)果 +---------+ | Email | +---------+ | a@b.com | +---------+ 解答 select Email from Person group by Email having count(Email) >= 2;
到此這篇關(guān)于淺談MySQL之select優(yōu)化方案的文章就介紹到這了,更多相關(guān)MySQL select優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL統(tǒng)計(jì)逗號(hào)分隔字段元素的個(gè)數(shù)
本文主要介紹了MYSQL統(tǒng)計(jì)逗號(hào)分隔字段元素的個(gè)數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01MySQL 的 21 個(gè)規(guī)范、優(yōu)化最佳實(shí)踐!
每一個(gè)好習(xí)慣都是一筆財(cái)富,本文分 SQL 后悔藥,SQL 性能優(yōu)化,SQL 規(guī)范優(yōu)雅三個(gè)方向,分享寫 SQL 的 21 個(gè)好習(xí)慣和最佳實(shí)踐2020-12-12在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例
這篇文章主要介紹了在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例,即一次查詢操作返回兩張表的結(jié)果,需要的朋友可以參考下2015-07-07MySQL數(shù)據(jù)庫手冊DATABASE操作與編碼(小白入門篇)
這篇文章主要介紹了MySQL數(shù)據(jù)庫手冊DATABASE操作與編碼的小白入門篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Mysql升級(jí)到5.7后遇到的group by查詢問題解決
這篇文章主要給大家介紹了關(guān)于Mysql升級(jí)到5.7后遇到的group by查詢問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)同樣遇到這個(gè)問題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09MySQL5.7限制general_log日志大小的實(shí)現(xiàn)
MySQL5.7.41中為避免通用查詢?nèi)罩緂eneral_log快速增長占用硬盤空間,可以通過定時(shí)任務(wù)執(zhí)行腳本進(jìn)行每日備份或清理,從而限制其大小,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10