欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL性能優(yōu)化方法及性能測(cè)試

 更新時(shí)間:2022年05月16日 08:45:14   作者:??蘇州程序大白????  
這篇文章主要介紹了SQL性能優(yōu)化方法及性能測(cè)試,文章圍繞主題展開詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助

笛卡爾連接

例1: 沒有攜帶on的條件字句,此條slq查詢的結(jié)構(gòu)集等價(jià)于,a表包含的條數(shù)*b表包含的乘積:

select * from table a cross join table b;

例2:擁有攜帶on字句的sql,等價(jià)于inner join

select * from table a cross join table b on a.id=b.id;

分頁limit的sql優(yōu)化的幾種方法

規(guī)則;表包含的數(shù)據(jù)較少的數(shù)據(jù)量,作為驅(qū)動(dòng)表(小表驅(qū)動(dòng)大表,一般mysql的優(yōu)化器會(huì)做出相應(yīng)的優(yōu)化的,但是為了防止一些抽風(fēng)現(xiàn)象可以用STRAIGHT_JOIN,作用會(huì)強(qiáng)制使用左邊的表作為驅(qū)動(dòng)表)。

例1:

select * from table c straight_join table d on c.id=d.id;

覆蓋索引:

select 主鍵字段或者創(chuàng)建過索引的字段 from table limit 300000,10

索引覆蓋+inner (業(yè)界常用的優(yōu)化方案)

select * from table a
inner join (
select 創(chuàng)建索引的字段 from table  limit 30000,10) b
on b.創(chuàng)建索引的字段=a.創(chuàng)建索引的字段 (也可以更換為 using (創(chuàng)建索引的字段))

索引覆蓋+子查詢 先獲取分頁起始的最小值,然后再獲取后10條 (業(yè)界常用的優(yōu)化方案)

select * from table
where 主鍵字段或者創(chuàng)建過索引的字段
                  >=
(select 主鍵字段或者創(chuàng)建過索引的字段 from table 300000,1)
limit 10;

范圍查詢+limit語句 獲取上一頁的主鍵最大值,然后進(jìn)行獲取后面的數(shù)據(jù);

例1; 上一頁的最大主鍵值為100

  select * from table
     where id > 100
     limit 10;

需要獲取起始主鍵值和結(jié)束主鍵值

select * from table
          where id between 起始主鍵值 and 結(jié)束主鍵值;

禁止傳入過大的頁碼 (例如;百度就是采用這種方式)

count 優(yōu)化方案

實(shí)例1:

    /**
    * 1:如果不包含非主鍵的索引,就會(huì)使用主鍵索引
    * 2:如果包含非主鍵的索引就會(huì)使用非主鍵索引;
    * 3:如果存在多個(gè)非主鍵索引,會(huì)使用key_len值較小的索引
    * 為什么會(huì)有這種規(guī)律呢?
    *  -innodb非主鍵索引:葉子結(jié)點(diǎn)儲(chǔ)存的是:索引+主鍵
    *   主鍵索引葉子結(jié)點(diǎn)儲(chǔ)存的是:主鍵+表數(shù)據(jù)
    *    在1page里面,非主鍵索引可以存儲(chǔ)更多的條目,對(duì)于一張表,假如擁有10000000數(shù)據(jù)
    *    使用非主鍵索引,掃描page 500,主鍵索引 100  非主鍵索引掃描的條目多,可以減少掃描的次數(shù)
    *
    **/
select count(*) from table

實(shí)例2:

    /**
     * count(字段) 只會(huì)針對(duì)該字段進(jìn)行統(tǒng)計(jì),使用這個(gè)字段上的索引(如果包含索引的情況)
     * count(子段) 會(huì)排出字段值為null的數(shù)據(jù)
     * count(*) 不會(huì)排出字段值為null的數(shù)據(jù)
     * count(*) 和 count(1) 沒有區(qū)別
     * 對(duì)于MyISAM引擎,如果 count(*) 沒有where條件,查詢效率會(huì)特別的快,因?yàn)榘褦?shù)據(jù)存儲(chǔ)到MyISAM引擎里了
     * 對(duì)于MySQL 8.0.13,InnoDB引擎,如果count(*) 沒有where條件查詢速度,也是特別的快,做出了相應(yīng)的優(yōu)化
     *
     *
    **/
select count(某個(gè)字段) from table 會(huì)把此字段的值為null過濾掉,僅僅只統(tǒng)計(jì)字段值不為null的

實(shí)例3:

    //做完本條查詢,去執(zhí)行count的操作
    select sql_calc_found_rows * from table limit 0,10;
    select found_rows() as count ;  通過此sql來獲取count的結(jié)果(須在終端進(jìn)行執(zhí)行)

注意:缺點(diǎn)在mysql8.0.17這種用法已經(jīng)被廢棄,未來會(huì)被永久刪除

實(shí)例4:優(yōu)點(diǎn)不操作具體的表,無論表的數(shù)據(jù)量有多大,都可以迅速執(zhí)行. 缺點(diǎn):統(tǒng)計(jì)的是一個(gè)估算值,適合要求統(tǒng)計(jì)數(shù)的精度不是太高的場(chǎng)景。

    select * from information_schema.TABLES
    where
       TABLE_SCHEMA='數(shù)據(jù)庫名稱'
    and
       TABLE_NAME ='表的名稱';

實(shí)例5: //優(yōu)點(diǎn)不操作具體的表,無論表的數(shù)據(jù)量有多大,都可以迅速執(zhí)行. 缺點(diǎn):統(tǒng)計(jì)的是一個(gè)估算值,適合要求統(tǒng)計(jì)數(shù)的精度不是太高的場(chǎng)景。

  show table status where NAME='表的名稱隔行'

實(shí)例6: //優(yōu)點(diǎn)不操作具體的表,無論表的數(shù)據(jù)量有多大,都可以迅速執(zhí)行. 缺點(diǎn):統(tǒng)計(jì)的是一個(gè)估算值,適合要求統(tǒng)計(jì)數(shù)的精度不是太高的場(chǎng)景。

 explain select * from table

實(shí)例7: 優(yōu)化案例; 目前有一張數(shù)量非常大的表,需要統(tǒng)計(jì)id值大于100的有多少條

  • 一般寫法:select count(*) from table where id>100;
  • mysql8.18版:逆向思維的寫法: select count()-(select count() from table where id <100) from table。
  • order by 的優(yōu)化:原則利用索引,避免排序。
 //first_name,last_name已經(jīng)在表里創(chuàng)建了組合索引,emp_no為主鍵;

實(shí)例1:

//此sql是不能利用到索引的,原因是:mysql的優(yōu)化器,是根據(jù)成本計(jì)算的,如果全表掃描比使用索引,成本更低時(shí)會(huì)使用全表掃描
//如何鑒定是否使用索引避免了排序呢? 通過explain 查看sql的性能如果Extra的值為null時(shí),說明是可以通過索引避免排序的.如果Extra的值是Using filesort 是不可以進(jìn)行索引排序的
select * from table order by first_name,last_name;
//此sql可以使用索引避免排序的
select * from table order by first_name,last_name limit 10;
//此sql可以使用索引避免排序的
/**
  *[Bader,last_name,emp_no]
  *[Bader,last_name,emp_no]
  *[Bader,last_name,emp_no]
  *[Bader,last_name,emp_no]
  *
**/
select * from table where fist_name='Bader' order by last_name;
//此sql可以使用索引避免排序的
/**
  *[Bader,last_name,emp_no]
  *[Ba,last_name,emp_no]
  *[Bad,last_name,emp_no]
  *[Bade,last_name,emp_no]
  *
**/
select * from table where fist_name<'Bader' order by last_name
//此sql可以使用索引避免排序的
 select * from table where fist_name='Bader' and last_name>'Peng' order by last_name
 //此sql可以使用索引避免排序的,原因排序的倆個(gè)字段,分別存在倆個(gè)索引中
 select * from table  order by first_name,emp_no;

索引失效的場(chǎng)景:

  • 1: join 字段的類型不一致
  • 2: 在=號(hào)的左邊,進(jìn)行加減操作

實(shí)例1:

     select * from employees e
     left join dept_emp de on e.emp_no=de.emp_no
     left join departments d on de.dept_no=d.dept_no
     where e.emp_no=1001;

拆分后:

    select * from employees where emp_no='1001';
    select * from dept_emp where emp_no='1001';
    select * from departments where dept_no='d005';

表的設(shè)計(jì)原則-三范式:

  • 范式:表的字段都是原子性,既每個(gè)表的字段都是不可分割的,不是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。
  • 范式:在第一范式的基礎(chǔ)上,每一行數(shù)據(jù)的唯一性,非主鍵字段要完全依賴于主鍵字段。
  • 范式:在滿足第二范式的基礎(chǔ)上,不能存在傳遞依賴。

到此這篇關(guān)于SQL性能優(yōu)化方法及性能測(cè)試的文章就介紹到這了,更多相關(guān)SQL性能優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • k8s搭建mysql集群實(shí)現(xiàn)主從復(fù)制的方法步驟

    k8s搭建mysql集群實(shí)現(xiàn)主從復(fù)制的方法步驟

    本文是基于已有k8s環(huán)境下,介紹在k8s環(huán)境中部署mysql主從集群的實(shí)現(xiàn)步驟,對(duì)mysql學(xué)習(xí)有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2023-01-01
  • Mysql using使用詳解

    Mysql using使用詳解

    本文主要介紹了Mysql using使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Mysql 模糊查詢和正則表達(dá)式實(shí)例詳解

    Mysql 模糊查詢和正則表達(dá)式實(shí)例詳解

    在MySQL中,可以使用LIKE運(yùn)算符進(jìn)行模糊查詢,LIKE運(yùn)算符用于匹配字符串模式,其中可以使用通配符來表示任意字符或字符序列,這篇文章主要介紹了Mysql 模糊查詢和正則表達(dá)式實(shí)例詳解,需要的朋友可以參考下
    2023-11-11
  • MySQL深分頁問題解決思路

    MySQL深分頁問題解決思路

    這篇文章主要介紹了優(yōu)雅地解決mysql深分頁問題,本文將會(huì)討論當(dāng)mysql表大數(shù)據(jù)量的情況,如何優(yōu)化深分頁問題,并附上最近的優(yōu)化慢sql問題的案例偽代碼,需要的朋友可以參考下
    2022-12-12
  • mysql正確刪除數(shù)據(jù)的方法(drop,delete,truncate)

    mysql正確刪除數(shù)據(jù)的方法(drop,delete,truncate)

    這篇文章主要給大家介紹了關(guān)于mysql正確刪除數(shù)據(jù)的相關(guān)資料,DELETE語句是MySQL中最常用的刪除數(shù)據(jù)的方式之一,但也有幾種其他方法來實(shí)現(xiàn),需要的朋友可以參考下
    2023-10-10
  • MySQL遷移到PostgreSQL操作指南

    MySQL遷移到PostgreSQL操作指南

    這篇文章主要介紹了MySQL遷移到PostgreSQL操作指南,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起來學(xué)習(xí)吧
    2023-10-10
  • 區(qū)分MySQL中的空值(null)和空字符('''')

    區(qū)分MySQL中的空值(null)和空字符('''')

    這篇文章主要介紹了如何區(qū)分MySQL中的空值(null)和空字符(''),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • 一文帶你深入了解?MySQL的鎖機(jī)制

    一文帶你深入了解?MySQL的鎖機(jī)制

    在數(shù)據(jù)庫系統(tǒng)中,同時(shí)有多個(gè)用戶或進(jìn)程訪問數(shù)據(jù)是常見的情況,為了確保數(shù)據(jù)的完整性和一致性,數(shù)據(jù)庫管理系統(tǒng)引入了鎖機(jī)制,本文將深入探討?MySQL?鎖機(jī)制,幫助您理解鎖的分類、實(shí)現(xiàn)方式以及使用場(chǎng)景和優(yōu)化策略,需要的朋友可以參考下
    2023-05-05
  • mysql數(shù)據(jù)庫常見基本操作實(shí)例分析【創(chuàng)建、查看、修改及刪除數(shù)據(jù)庫】

    mysql數(shù)據(jù)庫常見基本操作實(shí)例分析【創(chuàng)建、查看、修改及刪除數(shù)據(jù)庫】

    這篇文章主要介紹了mysql數(shù)據(jù)庫常見基本操作,結(jié)合實(shí)例形式分析了mysql創(chuàng)建、查看、修改及刪除數(shù)據(jù)庫實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • mysql 某字段插入隨機(jī)數(shù)(插入隨機(jī)數(shù)到MySQL數(shù)據(jù)庫)

    mysql 某字段插入隨機(jī)數(shù)(插入隨機(jī)數(shù)到MySQL數(shù)據(jù)庫)

    這篇文章主要介紹了mysql 某字段插入隨機(jī)數(shù)(插入隨機(jī)數(shù)到MySQL數(shù)據(jù)庫),需要的朋友可以參考下
    2016-09-09

最新評(píng)論