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

Mysql優(yōu)化技巧之Limit查詢的優(yōu)化分析

 更新時(shí)間:2019年07月25日 08:28:14   作者:舊夢(mèng)發(fā)癲  
這篇文章主要給大家介紹了關(guān)于Mysql優(yōu)化技巧之Limit查詢的優(yōu)化分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在實(shí)際業(yè)務(wù)中對(duì)于分頁(yè)來(lái)說(shuō)是一個(gè)比較常見(jiàn)的業(yè)務(wù)需求。那么就會(huì)使用到limit查詢,當(dāng)我們?cè)谑褂肔imit查詢的時(shí)候,在數(shù)據(jù)比較小、或者只查詢前面一部分?jǐn)?shù)據(jù)的時(shí)候效率是很高的。但是當(dāng)數(shù)據(jù)量大的時(shí)候,或者查詢offset數(shù)量比較大的時(shí)候,如:limit 100000,20效率往往就不盡人意了。通常的一個(gè)辦法就是Limit配合order by,如果order by有對(duì)用戶的索引的話,效率通常是比較不錯(cuò)的。

對(duì)于這種情況,最簡(jiǎn)單的查詢就是 使用覆蓋索引,查詢某些需要的列。這樣的效果是很好的

如下面這個(gè)

mysql> SELECT * FROM student LIMIT 1000000,1;
+---------+------------+------------+------------+-------+---------------------+
| id  | first_name | last_name | created_at | score | updated_at   |
+---------+------------+------------+------------+-------+---------------------+
| 1000001 | kF9DxBgnUi | yLXnPSHJpH | 2019-07-11 | 97 | 2019-07-11 14:29:59 | |
+---------+------------+------------+------------+-------+---------------------+
1 rows in set (0.31 sec)

可以看到時(shí)間

mysql> EXPLAIN SELECT score,first_name FROM student ORDER BY created_at LIMIT 1000000,20 \G
*************************** 1. row ***************************
   id: 1
 select_type: SIMPLE
  table: student
 partitions: NULL
   type: index
possible_keys: NULL
   key: time_sorce_name
  key_len: 69
   ref: NULL
   rows: 1000001
  filtered: 100.00
  Extra: Using index
1 row in set, 1 warning (0.00 sec)

mysql>

這樣的話查詢的列使用到的了覆蓋索引,掃描行數(shù)會(huì)減少很多,但是這樣的效果也不是很盡人意,但是如果有其他的查詢的話,這樣的查詢也會(huì)變的很慢。

比如我們加上last_name列。

如下

mysql> SELECT score,first_name,last_name FROM student ORDER BY created_at LIMIT 1000000,1;
+-------+------------+------------+
| score | first_name | last_name |
+-------+------------+------------+
| 86 | knKsV2g2fY | WB5qJeLZuk |
+-------+------------+------------+
1 row in set (4.81 sec)

mysql>

這個(gè)查詢需要執(zhí)行 4秒多的時(shí)間。通過(guò)分析可以看到這個(gè)查詢是沒(méi)有辦法使用索引的

mysql> explain SELECT score,first_name,last_name FROM student ORDER BY created_at LIMIT 1000000,1\G
*************************** 1. row ***************************
   id: 1
 select_type: SIMPLE
  table: student
 partitions: NULL
   type: ALL
possible_keys: NULL
   key: NULL
  key_len: NULL
   ref: NULL
   rows: 6489221
  filtered: 100.00
  Extra: Using filesort
1 row in set, 1 warning (0.00 sec)

mysql>

那么我們現(xiàn)在把查詢修改如下

mysql> SELECT student.score,student.first_name FROM student INNER JOIN (SELECT id FROM student ORDER BY created_at LIMIT 1000000,1 ) AS temp USING(id);
+-------+------------+
| score | first_name |
+-------+------------+
| 15 | 2QWZ  |
+-------+------------+
1 row in set (0.18 sec)
mysql> EXPLAIN SELECT student.score,student.first_name,last_name FROM student INNER JOIN (SELECT id FROM student ORDER BY created_at LIMIT 1000000,1 ) AS temp USING(id);
+----+-------------+------------+------------+--------+---------------+-----------------+---------+---------+---------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key    | key_len | ref  | rows | filtered | Extra  |
+----+-------------+------------+------------+--------+---------------+-----------------+---------+---------+---------+----------+-------------+
| 1 | PRIMARY  | <derived2> | NULL  | ALL | NULL   | NULL   | NULL | NULL | 1000001 | 100.00 | NULL  |
| 1 | PRIMARY  | student | NULL  | eq_ref | PRIMARY  | PRIMARY   | 4  | temp.id |  1 | 100.00 | NULL  |
| 2 | DERIVED  | student | NULL  | index | NULL   | time_sorce_name | 69  | NULL | 1000001 | 100.00 | Using index |
+----+-------------+------------+------------+--------+---------------+-----------------+---------+---------+---------+----------+-------------+
3 rows in set, 1 warning (0.00 sec)

分析結(jié)果,可以看到這個(gè)時(shí)候只查詢了1000001一條數(shù)據(jù)記錄。為什么會(huì)有這樣的變化呢。這種叫延時(shí)關(guān)聯(lián),先通過(guò)使用覆蓋索引查詢返回需要的主鍵,再根據(jù)主鍵關(guān)聯(lián)原表獲得需要的數(shù)據(jù),盡可能的減少了需要掃描的行數(shù)。

在某些特定的場(chǎng)合,其實(shí)有另外一種優(yōu)化方案的。比如要獲取最新的幾條插入記錄。那么在上一次查詢的時(shí)候我們可以記錄下最后一條記錄的主鍵ID(last_id)。
那么查詢就可以改為

SELECT score,first_name,last_name,id FROM student WHERE id>=last_id ORDER BY id ASC LIMIT 1

比如last_id=1000000那么這個(gè)查詢就會(huì)從1000000開(kāi)始。這樣的場(chǎng)景不管數(shù)據(jù)到多大的offset性能都會(huì)很好。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • MySQL多表查詢、事務(wù)與索引的實(shí)踐與應(yīng)用操作

    MySQL多表查詢、事務(wù)與索引的實(shí)踐與應(yīng)用操作

    本文圍繞MySQL數(shù)據(jù)庫(kù)操作展開(kāi),通過(guò)構(gòu)建部門(mén)與員工管理、餐飲業(yè)務(wù)相關(guān)的數(shù)據(jù)庫(kù)表,并填充測(cè)試數(shù)據(jù),系統(tǒng)地闡述了多表查詢的多種方式,包括內(nèi)連接、外連接和不同類(lèi)型的子查詢,同時(shí)介紹了事務(wù)的處理以及索引的創(chuàng)建、查詢和刪除操作,感興趣的朋友一起看看吧
    2025-04-04
  • MySQL入門(mén)教程(五)之表的創(chuàng)建、修改和刪除

    MySQL入門(mén)教程(五)之表的創(chuàng)建、修改和刪除

    MySQL 為關(guān)系型數(shù)據(jù)庫(kù)(Relational Database Management System), 本文給大家介紹MySQL入門(mén)教程(五)之表的創(chuàng)建、修改和刪除,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • 詳解 Mysql 事務(wù)和Mysql 日志

    詳解 Mysql 事務(wù)和Mysql 日志

    這篇文章主要介紹了詳解 Mysql 事務(wù)和Mysql 日志的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • Mysql查詢表中最小可用id值的方法

    Mysql查詢表中最小可用id值的方法

    這篇文章主要介紹了Mysql查詢表中最小可用id值的方法,在文中通過(guò)sql語(yǔ)句給大家介紹了MySQL中刪除id為最小的數(shù)據(jù),需要的朋友可以參考下
    2018-10-10
  • Mysql數(shù)據(jù)庫(kù)5.7升級(jí)到8.4的實(shí)現(xiàn)

    Mysql數(shù)據(jù)庫(kù)5.7升級(jí)到8.4的實(shí)現(xiàn)

    很多情況需要升級(jí)MySQL的數(shù)據(jù)庫(kù)版本,本文主要介紹了Mysql數(shù)據(jù)庫(kù)5.7升級(jí)到8.4的實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • mysql 查詢表中平均分最低的班級(jí)

    mysql 查詢表中平均分最低的班級(jí)

    查詢出dd(user_id,class_no,score)這個(gè)表中平均分最低的班級(jí)?
    2009-07-07
  • 查看本地MYSQL數(shù)據(jù)庫(kù)IP地址的三種方法

    查看本地MYSQL數(shù)據(jù)庫(kù)IP地址的三種方法

    本文介紹了多種方法來(lái)查看連接到本地MySQL服務(wù)器的IP地址,括使用SQL查詢從`information_schema.processlist`獲取IP地址,并通過(guò)`group by`進(jìn)行統(tǒng)計(jì),以及通過(guò)命令行工具如`mysql`和`awk`進(jìn)行過(guò)濾和計(jì)數(shù),這些方法有助于監(jiān)控和管理數(shù)據(jù)庫(kù)連接,需要的朋友可以參考下
    2024-10-10
  • Mysql如何實(shí)現(xiàn)不存在則插入,存在則更新

    Mysql如何實(shí)現(xiàn)不存在則插入,存在則更新

    這篇文章主要介紹了Mysql如何實(shí)現(xiàn)不存在則插入,存在則更新,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • mysql如何判斷同一字段是否有重復(fù)數(shù)據(jù)

    mysql如何判斷同一字段是否有重復(fù)數(shù)據(jù)

    這篇文章主要介紹了mysql如何判斷同一字段是否有重復(fù)數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Mysql中where與having的區(qū)別實(shí)例詳解

    Mysql中where與having的區(qū)別實(shí)例詳解

    當(dāng)SQL語(yǔ)句中使用聚合函數(shù),然后又需要對(duì)聚合函數(shù)的記錄集進(jìn)行篩選過(guò)濾時(shí),這個(gè)時(shí)候就需要用到Having子句,下面這篇文章主要給大家介紹了關(guān)于Mysql中where與having區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論

于田县| 乌拉特后旗| 额敏县| 连平县| 韶山市| 承德市| 张家界市| 天津市| 宣武区| 东山县| 太湖县| 积石山| 江华| 杭锦后旗| 阜城县| 汤阴县| 辽宁省| 南阳市| 长垣县| 舞阳县| 顺平县| 慈利县| 大方县| 阿拉善左旗| 灵宝市| 九龙县| 紫阳县| 岐山县| 吕梁市| 湘潭市| 中江县| 当阳市| 兰考县| 靖安县| 新郑市| 石狮市| 阿拉善左旗| 崇仁县| 日土县| 陇西县| 天全县|