最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL優(yōu)化老出錯,那是你沒弄明白MySQL解釋計劃用法

 更新時間:2021年11月25日 16:57:09   作者:香菜聊游戲  
本篇文章講的是SQL優(yōu)化老出錯,那是你沒弄明白MySQL解釋計劃用法,有興趣的小伙伴速度來看看吧,希望本篇文章能夠幫助到你

1、準備工作

準備三張表,一張角色表,一張裝備表,一張基礎(chǔ)數(shù)據(jù)表,這里只展示一些教程中需要的字段,在游戲開發(fā)的過程中肯定不止這么幾個字段,我想大家都懂的。

角色表:

CREATE TABLE `role` (
  `n_role_id` int DEFAULT NULL,
  `s_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

裝備表:

CREATE TABLE `equip` (
  `n_equip_id` int DEFAULT NULL,
  `s_equip_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `n_config_id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

裝備配置表

CREATE TABLE `dict_equip` (
  `n_equip_id` int DEFAULT NULL,
  `s_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

2、初識解釋計劃

有兩種方式可以查看解釋計劃:

1、命令的方式:explain sql,或者 desc sql ,兩個命令都可以,我覺得記住explain比較好,單詞很直接。

2、借助工具 Navicat(其他的不熟,估計也有),點擊查詢窗口的解釋,可以不用加關(guān)鍵字explain

可以看到結(jié)果里面包含了很多列,有的是null 有的有值,只要我們看懂了解釋計劃是不是就可以有的放矢的優(yōu)化sql。

3、字段詳解

解釋計劃的字段還是蠻多的,Navicat顯示了12個字段,有些字段我們需要重點關(guān)注,有些知道怎么回事就好了。

官方的文檔解釋:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

1、id 執(zhí)行的順序

id 是select的執(zhí)行順序,id越大優(yōu)先級越高,越先被執(zhí)行,id 相同時 下面的先執(zhí)行.

原因是因為執(zhí)行子查詢時,先查內(nèi)層的,再查外層

SELECT
    de.*
FROM
    dict_equip de
WHERE
    de.n_equip_id = (
        SELECT n_equip_id FROM equip e WHERE
            e.n_role_id = (
                SELECT n_role_id FROM role r WHERE r.s_name = '香菜' )
    )

從上面的執(zhí)行計劃可以看到先執(zhí)行了查詢role表,后執(zhí)行了equip ,最后執(zhí)行了 dict_equip

2、select_type select 的類型

3、table 查詢涉及的表或衍生表

當前輸出的正在使用的表,可以有下面幾種:

<unionM,N> : 行數(shù)據(jù)是聯(lián)合之后的數(shù)據(jù)id 處于 m和 n

<derived*N*>: 衍生表

<subqueryN>: 子查詢

4、partitions 查詢涉及到的分區(qū)

在使用分區(qū)表的時候才能用到,暫時沒用到過這種高級功能。

5、type 查詢的類型

表示MySQL在表中找到所需行的方式,又稱“訪問類型”,常見類型如下:

性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

由左至右,由最差到最好

在進行優(yōu)化的時候如果查詢出的數(shù)據(jù)量大的話可以使用全表掃描,避免使用索引。

如果只是查詢很少的數(shù)據(jù)盡量使用索引。

6、possible_keys:預(yù)計可能使用的索引

在不和其他表進行關(guān)聯(lián)的時候,查詢表的是可能使用的索引

7、key:實際查詢的過程中使用的索引

顯示MySQL在查詢中實際使用的索引,若沒有使用索引,顯示為NULL

8、key_len

表示索引中使用的字節(jié)數(shù),可通過該列計算查詢中使用的索引的長度

9、ref 顯示該表的索引字段關(guān)聯(lián)了哪張表的哪個字段

注: 我在equip 和 dict_equip 兩張表都分別添加了索引,索引列是n_equip_id

通過上面的執(zhí)行計劃可以看出,首先使用了索引

10、rows:根據(jù)表統(tǒng)計信息及選用情況,大致估算出找到所需的記錄或所需讀取的行數(shù),數(shù)值越小越好

比如 一個列上 雖然沒做索引,但是都是唯一的,這個時候查找的時候如果是全表讀取,就是表里有多少數(shù)據(jù)這個值就是多少,這個時候你需要優(yōu)化的就是盡可能的讀取少的表,可以增加索引,減少讀取行數(shù)

11、filtered:返回結(jié)果的行數(shù)占讀取行數(shù)的百分比,值越大越好

比如全表有100條數(shù)據(jù),可能讀取了全表數(shù)據(jù),但是只有一條匹配上,這個時候百分比就是1,所以你需要讓這個比例越大越好,也就是讀到的數(shù)據(jù)盡量都是有用的,避免讀取不用的數(shù)據(jù),因為IO是很費時的。

12、extra

常見的有下面幾種

use filesort:MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行,如果是這個值,應(yīng)該優(yōu)化索引。

use temporary:為了解決查詢,MySQL需要創(chuàng)建一個臨時表來容納結(jié)果。典型情況如查詢包含可以按不同情況列出列的GROUP BY和ORDER BY子句時。

use index:從只使用索引樹中的信息而不需要進一步搜索讀取實際的行來檢索表中的列信息。當查詢只使用作為單一索引一部分的列時,可以使用該策略

use where:where子句用于限制哪一行

總結(jié)

sql 優(yōu)化的原則就是在保證正確的情況下縮短時間,目標是確定的,通過目標進行回推可以知道想要執(zhí)行的快就要盡可能的少讀數(shù)據(jù),減少讀取數(shù)據(jù)的方式大的只有兩種過濾和使用索引,在這樣的規(guī)則范圍內(nèi)進行優(yōu)化,但是注意索引會占用額外的空間,要平衡好這兩者的關(guān)系。

到此這篇關(guān)于SQL優(yōu)化老出錯,那是你沒弄明白MySQL解釋計劃用法的文章就介紹到這了,更多相關(guān)SQL優(yōu)化 MySQL解釋計劃內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決大于5.7版本mysql的分組報錯Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated

    解決大于5.7版本mysql的分組報錯Expression #1 of SELECT list is not in GR

    這篇文章主要介紹了解決大于5.7版本mysql的分組報錯Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated問題,需要的朋友可以參考下
    2019-10-10
  • MySQL無GROUP BY直接HAVING返回空的問題分析

    MySQL無GROUP BY直接HAVING返回空的問題分析

    這篇文章主要介紹了MySQL無GROUP BY直接HAVING返回空的問題分析,學(xué)習(xí)MYSQL需要注意這個問題
    2013-11-11
  • Mysql事務(wù)隔離級別之讀提交詳解

    Mysql事務(wù)隔離級別之讀提交詳解

    這篇文章主要介紹了Mysql事務(wù)隔離級別之讀提交詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • MySQL5.7中的sql_mode默認值帶來的坑及解決方法

    MySQL5.7中的sql_mode默認值帶來的坑及解決方法

    這篇文章主要介紹了MySQL5.7中的sql_mode默認值帶來的坑及解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例

    Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例

    Datediff函數(shù),最大的作用就是計算日期差,能計算兩個格式相同的日期之間的差值,下面這篇文章主要給大家介紹了關(guān)于Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例?的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • MySQL表結(jié)構(gòu)變更你不可不知的Metadata Lock詳解

    MySQL表結(jié)構(gòu)變更你不可不知的Metadata Lock詳解

    這篇文章主要給大家介紹了關(guān)于MySQL表結(jié)構(gòu)變更你不可不知的Metadata Lock的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 使用MySQL實現(xiàn)一個分布式鎖

    使用MySQL實現(xiàn)一個分布式鎖

    在分布式系統(tǒng)中,分布鎖是一個最基礎(chǔ)的工具類。這篇文章主要介紹了用MySQL實現(xiàn)一個分布式鎖,本文通過實例代碼相結(jié)合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • 論一條select語句在MySQL是怎樣執(zhí)行的

    論一條select語句在MySQL是怎樣執(zhí)行的

    本文將建立一套建立一套MySQL的知識框架,通過討論select語句在MySQL是怎樣執(zhí)行的來展開內(nèi)容,感興趣的小伙伴一起來看下文吧
    2021-08-08
  • Mysql出生日期轉(zhuǎn)換為年齡并分組統(tǒng)計人數(shù)的方法示例

    Mysql出生日期轉(zhuǎn)換為年齡并分組統(tǒng)計人數(shù)的方法示例

    這篇文章主要給大家介紹了關(guān)于Mysql出生日期轉(zhuǎn)換為年齡并分組統(tǒng)計人數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Mysql中實現(xiàn)修改主鍵自增值

    Mysql中實現(xiàn)修改主鍵自增值

    這篇文章主要介紹了Mysql中實現(xiàn)修改主鍵自增值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論

宜都市| 台东县| 大丰市| 龙江县| 新竹市| 诏安县| 綦江县| 军事| 黑龙江省| 巴塘县| 航空| 沈阳市| 永新县| 开江县| 贵州省| 共和县| 南康市| 会同县| 郧西县| 荣昌县| 双城市| 武山县| 普兰县| 攀枝花市| 丹棱县| 来凤县| 乐业县| 分宜县| 浙江省| 明光市| 定兴县| 洛南县| 永昌县| 虹口区| 札达县| 额济纳旗| 共和县| 塔河县| 吴旗县| 青阳县| 临武县|