国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

了解索引對表的影響以及如何分析查詢計劃,在MySQL中進行SQL查詢性能調(diào)優(yōu)

如何設(shè)置MySQL數(shù)據(jù)庫和編寫存儲過程進行批量數(shù)據(jù)插入。通過理解這些概念,您將能夠優(yōu)化SQL查詢并提高數(shù)據(jù)庫的響應(yīng)時間。

在本文中,我們將學(xué)習如何通過對表列進行索引來提高SQL查詢的快速響應(yīng)時間。我們將涵蓋安裝MySQL、創(chuàng)建存儲過程、分析查詢以及了解索引的影響的步驟。

我在Ubuntu上使用了MySQL 8版本。同時,我使用Dbeavor工具作為MySQL客戶端連接到MySQL服務(wù)器。讓我們一起學(xué)習吧。

我在演示中使用了MySQL,然而,在所有其他數(shù)據(jù)庫中,概念是相同的。

MySQL,sql優(yōu)化

1.下面是我們安裝MySQL并使用root用戶訪問的方法。

這個MySQL實例僅用于測試,因此我使用了一個簡單的密碼

# 安裝
$ sudo apt install mysql-server
# 啟動服務(wù)
$ sudo systemctl start mysql.service
#開始使用服務(wù)
$ sudo mysql
# 設(shè)置密碼規(guī)則
mysql> SET GLOBAL validate_password.policy = 0;
# 設(shè)置一個簡單的密碼
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
# 退出
mysql> exit
# 試試重新登錄
$ mysql -uroot -ppassword

2.創(chuàng)建一個數(shù)據(jù)庫并使用它。

# 創(chuàng)建數(shù)據(jù)庫
mysql> create database testdb;
# 查看數(shù)據(jù)庫
mysql> show databases;
# 使用這個數(shù)據(jù)庫
mysql> use testdb;

3.創(chuàng)建兩個表,employee1和employee2。

其中,employee1沒有主鍵,而employee2有主鍵。

# 創(chuàng)建表 employee1
mysql> CREATE TABLE employee1 (id int,LastName varchar(255),FirstName varchar(255),Address varchar(255),profile varchar(255));
Query OK, 0 rows affected (0.01 sec)
# 創(chuàng)建表 employee2,并且設(shè)置一個主鍵 
mysql> CREATE TABLE employee2 (id int primary key,LastName varchar(255),FirstName varchar(255),Address varchar(255),profile varchar(255));
Query OK, 0 rows affected (0.02 sec
# 查看表
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| employee1        |
| employee2        |
+------------------+
2 rows in set (0.00 sec)

4. 檢查每個表的索引

我們會發(fā)現(xiàn)employee2表已經(jīng)在id列上有一個索引,因為它是主鍵。

mysql> SHOW INDEXES FROM employee1 \G;
Empty set (0.00 sec)

ERROR: 
No query specified

mysql> SHOW INDEXES FROM employee2 \G;
*************************** 1. row ***************************
        Table: employee2
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
1 row in set (0.00 sec)

ERROR: 
No query specified

5. 創(chuàng)建一個存儲過程來批量插入數(shù)據(jù)到這兩個表中。

我們將在每個表中插入20000條記錄。然后可以使用CALL procedure-name命令調(diào)用存儲過程。

mysql> 

CREATE PROCEDURE testdb.BulkInsert()
BEGIN
		DECLARE i INT DEFAULT 1;
truncate table employee1;
truncate table employee2;
WHILE (i <= 20000) DO
    INSERT INTO testdb.employee1 (id, FirstName, Address) VALUES(i, CONCAT("user","-",i), CONCAT("address","-",i));
    INSERT INTO testdb.employee2 (id,FirstName, Address) VALUES(i,CONCAT("user","-",i), CONCAT("address","-",i));    
   SET i = i+1;
END WHILE;
END

mysql> CALL testdb.BulkInsert() ;

mysql> SELECT COUNT(*) from employee1 e ;
COUNT(*)|
--------+
    20000|
    

mysql> SELECT COUNT(*) from employee2 e ;
COUNT(*)|
--------+
    20000|

6. 選擇任意隨機id的記錄

我們會發(fā)現(xiàn)employee1表的響應(yīng)速度較慢,因為它沒有任何索引。

mysql> select * from employee2 where id = 15433;
+-------+----------+------------+---------------+---------+
| id    | LastName | FirstName  | Address       | profile |
+-------+----------+------------+---------------+---------+
| 15433 | NULL     | user-15433 | address-15433 | NULL    |
+-------+----------+------------+---------------+---------+
1 row in set (0.00 sec)

mysql> select * from employee1 where id = 15433;
+-------+----------+------------+---------------+---------+
| id    | LastName | FirstName  | Address       | profile |
+-------+----------+------------+---------------+---------+
| 15433 | NULL     | user-15433 | address-15433 | NULL    |
+-------+----------+------------+---------------+---------+
1 row in set (0.03 sec)

mysql> select * from employee1 where id = 19728;
+-------+----------+------------+---------------+---------+
| id    | LastName | FirstName  | Address       | profile |
+-------+----------+------------+---------------+---------+
| 19728 | NULL     | user-19728 | address-19728 | NULL    |
+-------+----------+------------+---------------+---------+
1 row in set (0.03 sec)

mysql> select * from employee2 where id = 19728;
+-------+----------+------------+---------------+---------+
| id    | LastName | FirstName  | Address       | profile |
+-------+----------+------------+---------------+---------+
| 19728 | NULL     | user-19728 | address-19728 | NULL    |
+-------+----------+------------+---------------+---------+
1 row in set (0.00 sec)

mysql> select * from employee1 where id = 3456;
+------+----------+-----------+--------------+---------+
| id   | LastName | FirstName | Address      | profile |
+------+----------+-----------+--------------+---------+
| 3456 | NULL     | user-3456 | address-3456 | NULL    |
+------+----------+-----------+--------------+---------+
1 row in set (0.04 sec)

mysql> select * from employee2 where id = 3456;
+------+----------+-----------+--------------+---------+
| id   | LastName | FirstName | Address      | profile |
+------+----------+-----------+--------------+---------+
| 3456 | NULL     | user-3456 | address-3456 | NULL    |
+------+----------+-----------+--------------+---------+
1 row in set (0.00 sec)

7. 檢查命令EXPLAIN ANALYZE的輸出。

該命令實際執(zhí)行查詢,并對查詢進行規(guī)劃、監(jiān)控并計算在執(zhí)行計劃的各個點處所花費的時間和行數(shù)。

mysql> explain analyze select * from employee1 where id = 3456;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                               |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Filter: (employee1.id = 3456)  (cost=1989 rows=1965) (actual time=5.24..29.3 rows=1 loops=1)
    -> Table scan on employee1  (cost=1989 rows=19651) (actual time=0.0504..27.3 rows=20000 loops=1)
 |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

#從ChatGPT的詳細解釋中可以得到以下信息:

filter: (employee1.id = 3456):這表示在"employee1"表上執(zhí)行了一個過濾操作,只會選擇"id"列值為3456的行。

(cost=1989 rows=1965) (actual time=5.3..31.9 rows=1 loops=1):這部分提供了關(guān)于查詢執(zhí)行的一些性能相關(guān)信息:

cost=1989:它代表整個查詢執(zhí)行的成本估算。成本是度量執(zhí)行查詢所需的計算工作量的相對指標。

rows=1965:它表示在查詢的這一部分中將處理的預(yù)估行數(shù)。

actual time=5.3..31.9:這顯示了查詢執(zhí)行這一部分的實際時間,以毫秒為單位進行測量。

rows=1 loops=1:表示該查詢的這一部分在循環(huán)中執(zhí)行的次數(shù)。
-> Table scan on employee1 (cost=1989 rows=19651) (actual time=0.034..29.7 rows=20000 loops=1):這部分顯示正在"employee1"表上執(zhí)行表掃描操作:

Table scan:這意味著數(shù)據(jù)庫正在掃描整個"employee1"表,以查找與過濾條件匹配的行。

cost=1989:此表掃描操作的成本估算。

rows=19651:在"employee1"表中的預(yù)估行數(shù)。

actual time=0.034..29.7:表掃描操作的實際執(zhí)行時間,以毫秒為單位進行測量。

rows=20000 loops=1:此表掃描操作在循環(huán)中執(zhí)行的次數(shù)。

總體而言,這個查詢計劃表明數(shù)據(jù)庫正在執(zhí)行一個查詢,將"employee1"表進行篩選,僅返回"id"列等于3456的行。
表掃描操作讀取了共計20,000行以找到匹配的行,并且估算成本為1989個單位。
實際執(zhí)行時間為5.3至31.9毫秒,取決于符合過濾條件的行數(shù)。

在這里,我們發(fā)現(xiàn)對于employee1,執(zhí)行了一次表掃描,這意味著要掃描或搜索整個表來獲取結(jié)果。我們也稱之為對表進行全面掃描。

8. 對于employee2表,我們發(fā)現(xiàn)只搜索并獲取了一行結(jié)果。

因此,如果表中有很多記錄,我們將觀察到SQL查詢響應(yīng)時間的明顯改善。

mysql> explain analyze select * from employee2 where id = 3456;
+---------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                           |
+---------------------------------------------------------------------------------------------------+
| -> Rows fetched before execution  (cost=0..0 rows=1) (actual time=110e-6..190e-6 rows=1 loops=1)
 |
+---------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#根據(jù)ChatGPT對這個查詢計劃的解釋:

在執(zhí)行之前獲取的行:這部分表示數(shù)據(jù)庫在執(zhí)行主查詢之前獲取了一些數(shù)據(jù)。

(cost=0..0 rows=1):這個操作的成本估算為0個單位,它預(yù)期只獲取一行。

(actual time=110e-6..190e-6 rows=1 loops=1):這提供了數(shù)據(jù)獲取操作的實際時間:

actual time=110e-6..190e-6:數(shù)據(jù)獲取操作的實際時間范圍,以微秒(μs)為單位進行測量。

rows=1:獲取的行數(shù)。

loops=1:此數(shù)據(jù)獲取操作在循環(huán)中執(zhí)行的次數(shù)。

總體而言,查詢計劃的這部分表示數(shù)據(jù)庫在執(zhí)行主查詢之前獲取了一行數(shù)據(jù)。這個數(shù)據(jù)獲取操作的實際時間范圍為110到190微秒。這個初步的數(shù)據(jù)獲取可能與獲取一些執(zhí)行主查詢所需的關(guān)鍵信息或參數(shù)有關(guān)。

9. 讓我們分析當我們在兩個表的非索引列FirstName上搜索記錄時的查詢計劃。

從輸出中,我們發(fā)現(xiàn)執(zhí)行了表掃描來搜索記錄,這需要相當長的時間來獲取數(shù)據(jù)。

mysql> explain analyze select * from employee2 where FirstName = 'user-13456';
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                            |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Filter: (employee2.FirstName = 'user-13456')  (cost=2036 rows=2012) (actual time=15.7..24 rows=1 loops=1)
    -> Table scan on employee2  (cost=2036 rows=20115) (actual time=0.0733..17.8 rows=20000 loops=1)
 |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

mysql> explain analyze select * from employee1 where FirstName = 'user-13456';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Filter: (employee1.FirstName = 'user-13456')  (cost=1989 rows=1965) (actual time=23.7..35.2 rows=1 loops=1)
    -> Table scan on employee1  (cost=1989 rows=19651) (actual time=0.0439..28.9 rows=20000 loops=1)
 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

10. 在employee1表的FirstName列上創(chuàng)建一個索引

mysql> CREATE INDEX index1 ON employee1 (FirstName);
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show indexes from employee1 \G;
*************************** 1. row ***************************
        Table: employee1
   Non_unique: 1
     Key_name: index1
 Seq_in_index: 1
  Column_name: FirstName
    Collation: A
  Cardinality: 19651
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
1 row in set (0.01 sec)

ERROR: 
No query specified

11. 再次檢查兩個表在搜索FirstName列的單條記錄時的查詢計劃。

我們發(fā)現(xiàn)employee1快速提供響應(yīng),只有1行要搜索,并且在使用FirstName列上的索引時,在employee1表上執(zhí)行了索引查找。但對于employee2,響應(yīng)時間較長,并且要搜索所有20000行才能獲得響應(yīng)。

mysql> explain analyze select * from employee1 where FirstName = 'user-13456';
+-------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                             |
+-------------------------------------------------------------------------------------------------------------------------------------+
| -> Index lookup on employee1 using index1 (FirstName='user-13456')  (cost=0.35 rows=1) (actual time=0.0594..0.0669 rows=1 loops=1)
 |
+-------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


mysql> explain analyze select * from employee2 where FirstName = 'user-13456';
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                             |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Filter: (employee2.FirstName = 'user-13456')  (cost=2036 rows=2012) (actual time=15.7..23.5 rows=1 loops=1)
    -> Table scan on employee2  (cost=2036 rows=20115) (actual time=0.075..17.5 rows=20000 loops=1)
 |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

就是這樣,同學(xué)們。本文將幫助我們理解索引對表的影響,如何使用"explain analyze"命令分析查詢。還有關(guān)于如何設(shè)置MySQL和如何編寫用于批量插入的存儲過程的學(xué)習內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/article/686.html


到此這篇關(guān)于了解索引對表的影響以及如何分析查詢計劃,在MySQL中進行SQL查詢性能調(diào)優(yōu)的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/686.html

如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請聯(lián)系站長進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【flink番外篇】9、Flink Table API 支持的操作示例(4)- Table API 對表的查詢、過濾操作

    一、Flink 專欄 Flink 專欄系統(tǒng)介紹某一知識點,并輔以具體的示例進行說明。 1、Flink 部署系列 本部分介紹Flink的部署、配置相關(guān)基礎(chǔ)內(nèi)容。 2、Flink基礎(chǔ)系列 本部分介紹Flink 的基礎(chǔ)部分,比如術(shù)語、架構(gòu)、編程模型、編程指南、基本的datastream api用法、四大基石等內(nèi)容。 3、

    2024年01月17日
    瀏覽(20)
  • 如何查詢oracle中一個表的一個字段是否加了索引

    要查詢Oracle數(shù)據(jù)庫中一個表的一個字段是否已添加索引,可以使用以下SQL語句: 在上面的SQL語句中,將your_table_name替換為你要查詢的表的名稱,將your_column_name替換為你要查詢的字段的名稱。 這個查詢語句會返回與指定表和字段關(guān)聯(lián)的所有索引的名稱和列名稱。如果返回結(jié)果

    2024年04月16日
    瀏覽(28)
  • 可抓取性和可索引性:它們是什么以及如何影響搜索引擎優(yōu)化

    可抓取性和可索引性:它們是什么以及如何影響搜索引擎優(yōu)化

    網(wǎng)頁的可抓取性是指搜索引擎(如谷歌)發(fā)現(xiàn)網(wǎng)頁的難易程度。 谷歌發(fā)現(xiàn)網(wǎng)頁的過程稱為爬行。它使用稱為網(wǎng)絡(luò)爬蟲(也稱為機器人或蜘蛛)的計算機程序。這些程序會跟蹤網(wǎng)頁之間的鏈接,以發(fā)現(xiàn)新的或更新的網(wǎng)頁。 索引通常是在爬行之后進行的。 網(wǎng)頁的可索引性意味著

    2024年02月01日
    瀏覽(57)
  • 【postgresql 基礎(chǔ)入門】表的操作,表結(jié)構(gòu)查看、修改字段類型、增加刪除字段、重命名表,對表的操作總是比別人棋高一著

    ? 專欄內(nèi)容 : postgresql內(nèi)核源碼分析 手寫數(shù)據(jù)庫toadb 并發(fā)編程 ? 開源貢獻 : toadb開源庫 個人主頁 :我的主頁 管理社區(qū) :開源數(shù)據(jù)庫 座右銘:天行健,君子以自強不息;地勢坤,君子以厚德載物. 入門準備 postgrersql基礎(chǔ)架構(gòu) 快速使用 初始化集群 數(shù)據(jù)庫服務(wù)管理 psql客戶

    2024年02月08日
    瀏覽(195)
  • 外文期刊影響因子去哪里查詢,如何查詢

    外文期刊影響因子去哪里查詢,如何查詢

    期刊影響因子(Impact factor,IF),是代表期刊影響大小的一項定量指標。也就是某刊平均每篇論文的被引用數(shù),它實際上是某刊在某年被全部源刊物引證該刊前兩年發(fā)表論文的次數(shù),與該刊前兩年所發(fā)表的全部源論文數(shù)之比。那么,去哪里查詢以及怎么查詢期刊的影響因子呢?

    2024年02月15日
    瀏覽(23)
  • 淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

    淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

    目錄 (一)前言 (二)正文 1.?物化視圖(索引視圖)與查詢重寫的基本概念 2. 創(chuàng)建測試環(huán)境 (1)建表 (2)寫數(shù)據(jù) 3.?索引視圖創(chuàng)建 (1)創(chuàng)建語法 (2)為索引視圖創(chuàng)建索引 ?4. 查詢重寫 5.?為什么查詢會被重寫 ?6.?索引視圖什么時候更新 7.?改變基于視圖的查詢 之前做

    2024年02月05日
    瀏覽(108)
  • Java操作elasticSearch復(fù)雜查詢以及解析數(shù)據(jù)以及索引保存數(shù)據(jù)

    Java操作elasticSearch復(fù)雜查詢以及解析數(shù)據(jù)以及索引保存數(shù)據(jù)

    說明:基于銀行測試庫的操作 es的銀行測試庫,看一個Kibana操作 然后用java檢索解析這個數(shù)據(jù) 聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均薪資 以下是分解思路實現(xiàn)步驟: #聚合搜索 address 中包含 mill 的所有人的年齡分布以及平均年齡 GET bank/_search { “query”:{ “

    2024年02月10日
    瀏覽(27)
  • 二、SQL,如何實現(xiàn)表的創(chuàng)建和查詢

    二、SQL,如何實現(xiàn)表的創(chuàng)建和查詢

    示例: 示例: ?

    2024年02月12日
    瀏覽(12)
  • C語言中線性表的合并&有序表的合并以及案例分析和實現(xiàn)

    **線性列表合并:** ? 案例分析: 要合并兩個線性列表,我們考慮以下情況: ? 1. 兩個列表都是空的:在這種情況下,合并的列表也將是空的。 2. 一個列表是空的:如果其中一個列表是空的,則合并的列表將是非空列表本身。 3. 兩個列表都是非空的:在這種情況下,我們同

    2024年02月01日
    瀏覽(22)
  • 如何使用索引加速 SQL 查詢 [Python 版]

    推薦:使用 NSDT場景編輯器助你快速搭建可二次編輯器的3D應(yīng)用場景 假設(shè)您正在篩選一本書的頁面。而且您希望更快地找到所需的信息。你是怎么做到的?好吧,您可能會查找術(shù)語索引,然后跳轉(zhuǎn)到引用特定術(shù)語的頁面。SQL 中的索引的工作方式與書籍 中的索引 類似。 在大多

    2024年02月13日
    瀏覽(632)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包