MySQL如何進行索引重建操作?

来源:https://www.cnblogs.com/kerrycode/archive/2019/10/20/11706730.html
-Advertisement-
Play Games

在MySQL資料庫中,沒有類似於SQL Server資料庫或Oracle資料庫中索引重建的語法(ALTER INDEX ... REBUILD),那麼在MySQL資料庫中,是否有什麼方式重建索引呢? 在官方文檔中"2.11.10 Rebuilding or Repairing Tables or I... ...


在MySQL資料庫中,沒有類似於SQL Server資料庫或Oracle資料庫中索引重建的語法(ALTER INDEX ... REBUILD),那麼在MySQL資料庫中,是否有什麼方式重建索引呢? 在官方文檔中"2.11.10 Rebuilding or Repairing Tables or Indexes"中,提到下麵三種方式可以Rebuild Index

 

·         Dump and Reload Method

 

·         ALTER TABLE Method

 

·         REPAIR TABLE Method

 

 

另外, OPTIMIZE TABLE也會對索引進行重建,下麵我們來簡單驗證、測試一下,如有不對或不足的地方,敬請指正。

 

 

第一種方法(mysqldump導出然後重新導入),相當於重新CREATE INDEXES , 這裡就不討論了。下麵我們來看看其它幾種方法,那麼要判斷索引是否REBUILD了呢?我們來測試驗證一下吧,新建測試表如下:

 

 

CREATE TABLE t1 (
    c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    c2 VARCHAR(100),
    c3 VARCHAR(100) )
ENGINE=InnoDB;
 
create index ix_t1_c2 on t1(c2);

 

 

 

DROP INDEX + CREATE INDEX方法

 

這種方法過於簡單,這裡不敘說了。其實也沒有啥好說的。

 

 

 

ALTER TABLE方法

 

 

那麼我們能否在MySQL中找到索引的創建或修改時間呢?經過查證,目前而言,MySQL中是沒有相關係統表或視圖會記錄索引的創建時間的,我們可以用間接的方法來間接驗證,有些方法不是特別可靠和準確,最準確的方法應該是閱讀源碼:

 

 

1:表的創建時間,可以間接推斷索引的創建時間。因為索引的創建時間肯定在表的創建時間之後。

 

2:對應表的idb文件的修改或創建時間(若文件從創建後不曾修改過則可認為創建時間=修改時間,關於更多詳細內容,參考Linux如何查找文件的創建時間,當然這種方法不是非常準確。我們知道,對於InnoDB存儲引擎的表而言,對應的索引數據存儲在ibd文件中,所以文件的創建時間或修改時間是間接判斷索引創建時間。如果存儲引擎為MyISAM的話,還有專門的索引文件MYI。

 

註意:show indexes from tablename不會顯示索引創建時間

 

mysql> SELECT table_name,create_time FROM  information_schema.TABLES WHERE table_name='t1';
+------------+---------------------+
| TABLE_NAME | CREATE_TIME         |
+------------+---------------------+
| t1         | 2019-10-20 08:18:33 |
+------------+---------------------+
1 row in set (0.01 sec)

 

 

然後我們對錶進行ALTER TABLE t1 ENGINE = InnoDB;進行操作後,然後去驗證表的創建時間,如下所示,其實ALTER TABLE xxx ENGINE=InnoDB 其實等價於REBUILD表(REBUILD表就是重建表的意思),所以索引也等價於重新創建了。

 

 

clip_image001

 

 

在另外一個視窗,我們對比t1.ibd的創建時間,如下所示,也間接驗證了表和索引都REBUILD了。(這裡是MySQL 8.0.18 ,如果是之前的版本,還有frm之類的文件。)

 

 

 
[root@db-server MyDB]# ls -lrt t1*
-rw-r-----. 1 mysql mysql 131072 Oct 20 08:18 t1.ibd
[root@db-server MyDB]# stat t1.ibd
  File: ‘t1.ibd’
  Size: 131072          Blocks: 224        IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 106665154   Links: 1
Access: (0640/-rw-r-----)  Uid: ( 1000/   mysql)   Gid: ( 1000/   mysql)
Context: system_u:object_r:mysqld_db_t:s0
Access: 2019-10-20 08:18:25.911990445 +0800
Modify: 2019-10-20 08:18:33.626989940 +0800
Change: 2019-10-20 08:18:33.626989940 +0800
 Birth: -
[root@db-server MyDB]# stat t1.ibd
  File: ‘t1.ibd’
  Size: 131072          Blocks: 224        IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 106665156   Links: 1
Access: (0640/-rw-r-----)  Uid: ( 1000/   mysql)   Gid: ( 1000/   mysql)
Context: system_u:object_r:mysqld_db_t:s0
Access: 2019-10-20 08:20:50.866980953 +0800
Modify: 2019-10-20 08:20:51.744980896 +0800
Change: 2019-10-20 08:20:51.744980896 +0800
 Birth: -

 

clip_image002

 

 

 

 

REPAIR TABLE方法

 

REPAIR TABLE方法用於修複被破壞的表,而且它僅僅能用於MyISAM, ARCHIVE,CSV類型的表。下麵的測試環境為MySQL 5.6.41,創建測試表,然後對錶進行REPAIR TABLE操作

 

 

mysql> CREATE TABLE t (
    ->     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->     c2 VARCHAR(100),
    ->     c3 VARCHAR(100) )
    -> ENGINE=MyISAM;
Query OK, 0 rows affected (0.01 sec)
 
mysql> SELECT table_name,create_time FROM  information_schema.TABLES WHERE table_name='t';
+------------+---------------------+
| table_name | create_time         |
+------------+---------------------+
| t          | 2019-10-20 08:35:43 |
+------------+---------------------+
1 row in set (0.00 sec)

 

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系統環境: node節點 操作系統: CentOS-7-x86_64-DVD-1908.iso node節點 IP地址: 192.168.1.204 node節點 hostname(主機名, 請和保持node節點主機名 和master不同):k8s.node03 目標: 在該機器安裝k8s node ...
  • / 參數:@PrimaryKey 主鍵,@OrderBy 排序欄位,@SqlStr sql語句,@PageSize 每頁顯示的記錄,@PageIndex 當前頁(從0開始) / ALTER procedure [dbo].[PageQuery] @PrimaryKey varchar(100), 主 ...
  • 安裝&配置 在apache的官方網站提供了好多鏡像下載地址,然後找到對應的版本 下載地址: http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz Windows下安裝 把下載的zookeep ...
  • rm-rf /* 不能用 完全刪除 資料庫不能直接存儲數據 table 表 DB 資料庫 DBMS 資料庫操作系統 SQL 結構化查詢語言 語句不區分大小寫,但字元串常量區區分大小寫。建議命令大寫。 SELECT 查找 SQL語言是由DDL,DML,DQL和DCL組成 ...
  • 創建資料庫: 輸入:CREATE DATABASE itcase;電腦輸出: Query OK, 1 row affected 查看資料庫:輸入:SHOW DATABASES;電腦輸出: + +| Database |+ +| information_schema || itcast || my ...
  • 緣起 最近做一個項目,類似某度雲盤,另外附加定製功能,本人負責雲盤相關功能實現,這個項目跟雲盤不同的是,以項目為分配許可權的單位,同一個項目及子目錄所有有許可權的用戶可以同時操作所有文件,這樣就很容易出現併發操作,而且表結構設計的時候,定下來文件和文件夾都有個path欄位,存儲的是所在父級文件夾路徑,這 ...
  • key 操作 刪除 key:del key 查看所有的 key(一次性遍歷整個資料庫,生產上慎重使用):keys [pattern] 利用 cursor 分頁查詢記錄(漸進的遍歷整個資料庫,生產上推薦):scan cursor [MATCH pattern] [COUNT count] 序列化給定 ...
  • 1.報錯信息: 2.出現錯誤操作: 3.解決方法 在MySQL中取消外鍵約束: 執行 之後在設置外鍵約束:`set foreign_key_checks=1;` ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...