佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 淺談MySQL之select優(yōu)化方案

淺談MySQL之select優(yōu)化方案

熱門(mén)標(biāo)簽:服務(wù)外包 Linux服務(wù)器 網(wǎng)站排名優(yōu)化 百度競(jìng)價(jià)排名 AI電銷 鐵路電話系統(tǒng) 地方門(mén)戶網(wǎng)站 呼叫中心市場(chǎng)需求

生活中的例子

我們是否看到過(guò)在公司中許多查詢語(yǔ)句都是select * xxxx

心中的想法肯定是,別人寫(xiě)了select *,那我寫(xiě)吧,省去了不少麻煩事兒

慢查詢

  • 首先去思考,最基本的,是否我們使用的數(shù)據(jù)庫(kù)插查詢語(yǔ)句存在了訪問(wèn)的數(shù)據(jù)太多
  • 其實(shí)大部分性能低的查詢往往都可以通過(guò)減少訪問(wèn)的數(shù)據(jù)量來(lái)優(yōu)化的
  • 因?yàn)閟elect * 會(huì)給服務(wù)器帶來(lái)額外的I/O、內(nèi)存和cpu的消耗

數(shù)據(jù)庫(kù)中慢查詢開(kāi)銷的三個(gè)指標(biāo)

  • 相應(yīng)時(shí)間
  • 掃描的行數(shù)
  • 返回的行數(shù)

如果走了索引

select * from stu where id = 1;

索引會(huì)優(yōu)化查詢,只返回十條數(shù)據(jù)
如果沒(méi)有id索引,那么就會(huì)預(yù)估訪問(wèn)上百上千行數(shù)據(jù)

tips: 通過(guò)mysql中的EXPLAIN命令去查看的其中rows對(duì)應(yīng)的行數(shù)

其實(shí)最好的情況就是在存儲(chǔ)引擎層過(guò)where濾掉不匹配的記錄
其次好的情況是覆蓋索引命中掃描,在服務(wù)器層where濾掉不匹配的記錄,不需要回表查詢
最的情況是從數(shù)據(jù)表返回?cái)?shù)據(jù),然后再過(guò)濾不滿足條件的記錄

如何去優(yōu)化

使用索引覆蓋,把我們需要的列都放在索引中,這樣我們就避免了回表去查詢
可以單獨(dú)分出來(lái)表

3.重構(gòu)查詢(可以進(jìn)行大的查詢化解成小的查詢)

舉例: 如count、limit、max()

count

count 最好的優(yōu)化就是增加匯總表,因?yàn)閏ount不可避免需要掃描大量的行

limit

limit我們?cè)谧龇猪?yè)的時(shí)候很常用,如下面代碼

select id from stu order by id limit 1000,20;

這條語(yǔ)句會(huì)查詢1020條數(shù)據(jù)然后丟掉前一千條返回1000~1020的二十條數(shù)據(jù)
那么優(yōu)化的最好的方式就是走索引,這樣limit查詢查就能變成已知位置的查詢

最大值最小值minmax

首先我們?cè)囅肴绻叩氖侵麈I索引,那么我們?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ù)

最后我們來(lái)做兩道題放松一下吧

找出`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)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳細(xì)聊聊MySQL中慢SQL優(yōu)化的方向
  • Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程
  • MySQL千萬(wàn)級(jí)數(shù)據(jù)表的優(yōu)化實(shí)戰(zhàn)記錄
  • MySql子查詢IN的執(zhí)行和優(yōu)化的實(shí)現(xiàn)
  • 帶你快速搞定Mysql優(yōu)化
  • mysql 數(shù)據(jù)插入優(yōu)化方法之concurrent_insert
  • mysql優(yōu)化之query_cache_limit參數(shù)說(shuō)明
  • MySQL優(yōu)化之如何寫(xiě)出高質(zhì)量sql語(yǔ)句
  • mysql查詢優(yōu)化之100萬(wàn)條數(shù)據(jù)的一張表優(yōu)化方案
  • MYSQL 的10大經(jīng)典優(yōu)化案例場(chǎng)景實(shí)戰(zhàn)

標(biāo)簽:湖南 黃山 湘潭 衡水 蘭州 銅川 崇左 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談MySQL之select優(yōu)化方案》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    清水县| 新乡县| 巨鹿县| 普格县| 应用必备| 海城市| 平凉市| 吐鲁番市| 微博| 茌平县| 苗栗县| 高密市| 翼城县| 津市市| 石家庄市| 渝中区| 尼勒克县| 岳阳市| 灌阳县| 长白| 长兴县| 沈丘县| 马龙县| 黔西县| 精河县| 阿克陶县| 宁武县| 都兰县| 马尔康县| 什邡市| 唐河县| 高碑店市| 哈密市| 休宁县| 定边县| 大石桥市| 桐梓县| 佛教| 修水县| 崇阳县| 德保县|