」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握資料庫操作:索引、視圖、備份和恢復

掌握資料庫操作:索引、視圖、備份和恢復

發佈於2024-08-23
瀏覽:907

介绍

Mastering Database Operations: Index, View, Backup, and Recovery

在本实验中,我们将学习和练习索引、视图、备份和恢复。这些概念对于数据库管理员来说非常重要。

学习目标

  • 创建索引
  • 创建视图
  • 备份与恢复

准备

开始之前,我们需要准备好环境。

启动MySQL服务并以root身份登录。

cd ~/project
sudo service mysql start
mysql -u root

加载文件中的数据。需要在MySQL控制台输入命令来构建数据库:

source ~/project/init-database.txt

指数

索引是与表相关的结构。它的作用相当于一本书的目录。您可以根据目录中的页码快速找到内容。

当你要查询一张记录较多的表,并且该表没有索引时,那么会拉出所有记录一一匹配搜索条件,并返回符合条件的记录。非常耗时,并且会导致大量的磁盘I/O操作。

如果表中存在索引,那么我们可以通过索引值快速找到表中的数据,从而大大加快查询过程。

有两种方法可以为特定列设置索引:

ALTER TABLE table name ADD INDEX index name (column name);

CREATE INDEX index name ON table name (column name);

让我们用这两条语句来建立一个索引。

在employee表的id列建立idx_id索引:

ALTER TABLE employee ADD INDEX idx_id (id);

在employee表的name列建立idx_name索引

CREATE INDEX idx_name ON employee (name);

我们使用索引来加速查询过程。当没有足够的数据时,我们将无法感受到它的神奇力量。这里我们使用命令SHOW INDEX FROM table name来查看我们刚刚创建的索引。

SHOW INDEX FROM employee;
MariaDB [mysql_labex]> ALTER TABLE employee ADD INDEX idx_id (id);
Query OK, 0 rows affected (0.005 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [mysql_labex]> SHOW INDEX FROM employee;
 ---------- ------------ ---------- -------------- ------------- ----------- ------------- ---------- -------- ------ ------------ --------- --------------- --------- 
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Ignored |
 ---------- ------------ ---------- -------------- ------------- ----------- ------------- ---------- -------- ------ ------------ --------- --------------- --------- 
| employee |          0 | PRIMARY  |            1 | id          | A         |           5 |     NULL | NULL   |      | BTREE      |         |               | NO      |
| employee |          0 | phone    |            1 | phone       | A         |           5 |     NULL | NULL   |      | BTREE      |         |               | NO      |
| employee |          1 | emp_fk   |            1 | in_dpt      | A         |           5 |     NULL | NULL   |      | BTREE      |         |               | NO      |
| employee |          1 | idx_id   |            1 | id          | A         |           5 |     NULL | NULL   |      | BTREE      |         |               | NO      |
| employee |          1 | idx_name |            1 | name        | A         |           5 |     NULL | NULL   | YES  | BTREE      |         |               | NO      |
 ---------- ------------ ---------- -------------- ------------- ----------- ------------- ---------- -------- ------ ------------ --------- --------------- --------- 
5 rows in set (0.000 sec)

当我们使用SELECT语句查询时,WHERE条件会自动判断是否存在索引。

看法

视图是从一个或多个表派生的虚拟表。它就像一个窗口,通过它人们可以查看系统提供的特殊数据,这样就不必查看数据库中的全部数据。他们可以专注于他们感兴趣的事情。

如何解释“View是虚拟表”?

  • 数据库中只存储View的定义,而其数据存储在原表中;
  • 当我们使用View查询数据时,数据库会相应地从原表中提取数据。
  • 由于View中的数据取决于原始表中存储的内容,一旦表中的数据发生变化,我们在View中看到的内容也会发生变化。
  • 将 View 视为表格。

创建View使用的语句格式:

CREATE VIEW view name (column a, column b, column c) AS SELECT column 1, column 2, column 3 FROM table name;

从语句中我们可以看出,后半部分是一条SELECT语句,这意味着View也可以建立在多个表上。我们需要做的就是在 SELECT 语句中使用子查询或联接。

现在让我们创建一个名为 v_emp 的简单视图,其中包含三列 v_namev_agev_phone:

CREATE VIEW v_emp (v_name,v_age,v_phone) AS SELECT name,age,phone FROM employee;

然后输入

SELECT * FROM v_emp;
MariaDB [mysql_labex]> CREATE VIEW v_emp (v_name,v_age,v_phone) AS SELECT name,age,phone FROM employee;
Query OK, 0 rows affected (0.003 sec)

MariaDB [mysql_labex]> SELECT * FROM v_emp;
 -------- ------- --------- 
| v_name | v_age | v_phone |
 -------- ------- --------- 
| Tom    |    26 |  119119 |
| Jack   |    24 |  120120 |
| Jobs   |  NULL |   19283 |
| Tony   |  NULL |  102938 |
| Rose   |    22 |  114114 |
 -------- ------- --------- 
5 rows in set (0.000 sec)

备份

出于安全考虑,备份在数据库管理中极其重要。

导出文件仅保存数据库中的数据,而备份将整个数据库结构(包括数据、约束、索引、视图等)保存到新文件中。

mysqldump是MySQL中用于备份的实用程序。它生成一个 SQL 脚本文件,其中包含从头开始重新创建数据库的所有基本命令,例如 CREATE、INSERT 等。

使用mysqldump备份的语句:

mysqldump -u root database name > backup file name;   #backup entire database

mysqldump -u root database name table name > backup file name;  #backup the entire table

尝试备份整个数据库mysql_labex。将文件命名为 bak.sql。首先按Ctrl Z退出MySQL控制台,然后打开终端输入命令:

cd ~/project/
mysqldump -u root mysql_labex > bak.sql;

使用命令“ls”,我们会看到备份文件bak.sql;

cat bak.sql
-- MariaDB dump 10.19  Distrib 10.6.12-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: mysql_labex
-- ------------------------------------------------------
-- Server version       10.6.12-MariaDB-0ubuntu0.22.04.1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE=' 00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

……

恢复

在本实验的前面,我们练习了使用备份文件来恢复数据库。我们使用了类似这样的命令:

source ~/project/init-database.txt

此语句从 import-database.txt 文件恢复 mysql_labex 数据库。

还有另一种恢复数据库的方法,但在此之前,我们需要先创建一个名为test的空数据库:

mysql -u root
CREATE DATABASE test;
MariaDB [(none)]> CREATE DATABASE test;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> SHOW DATABASES;
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| mysql              |
| mysql_labex        |
| performance_schema |
| sys                |
| test               |
 -------------------- 
6 rows in set (0.000 sec)

Ctrl Z退出MySQL。将bak.sql恢复到测试数据库:

mysql -u root test 



我们可以通过输入命令查看测试数据库中的表来确认恢复是否成功:

mysql -u root
USE test
SHOW TABLES
MariaDB [(none)]> USE test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [test]> SHOW TABLES;
 ---------------- 
| Tables_in_test |
 ---------------- 
| department     |
| employee       |
| project        |
| table_1        |
 ---------------- 
4 rows in set (0.000 sec)

我们可以看到4张表已经恢复到测试数据库了。

概括

恭喜!您已经完成了有关 MySQL 中其他基本操作的实验。您已经学习了如何创建索引、视图以及如何备份和恢复数据库。


?立即练习:其他基本操作


想了解更多吗?

  • ?了解最新的 MySQL 技能树
  • ?阅读更多 MySQL 教程
  • ?加入我们的 Discord 或发推文@WeAreLabEx
版本聲明 本文轉載於:https://dev.to/labex/mastering-database-operations-index-view-backup-and-recovery-26dp?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 尋找經濟實惠的同日格蘭尼公寓(附 Pillar Build Granny Flats)
    尋找經濟實惠的同日格蘭尼公寓(附 Pillar Build Granny Flats)
    在 Pillar Build Granny Flats,我們為您提供祖母屋解決方案的精英服務,滿足您的獨特需求。無論是房主、承包商還是投資者,我們都可以幫助您在當天購買後院公寓,效果非常好,為您節省寶貴的時間,而且不用說,預算也很實惠。我們的祖母房建造者將在每一步工作,以確保您的專案以最精確和細心的...
    程式設計 發佈於2024-11-05
  • 如何使用 botoith Google Colab 和 AWS 集成
    如何使用 botoith Google Colab 和 AWS 集成
    您有沒有想過,在實施AWS Lambda時,想要一一確認程式碼的運作情況? 您可能認為在 AWS 控制台上實施很痛苦,因為您必須執行 Lambda 函數並且每次都會產生成本。 因此,我將向您展示您的擔憂的解決方案。 它是透過 Google Colab 和 AWS 整合實現的。 步驟如下: ...
    程式設計 發佈於2024-11-05
  • (高效能 Web 應用程式的要求
    (高效能 Web 應用程式的要求
    “高性能网络应用程序”或“前端”到底是什么? 自从 Internet Explorer 时代衰落以来,JavaScript 生态系统变得越来越强大,“前端”一词已成为高性能、现代 Web 客户端的代名词。这个“前端”世界的核心是 React。事实上,在前端开发中不使用 React 常常会让一个人看...
    程式設計 發佈於2024-11-05
  • 如何將單一輸入欄位設定為分區輸入?
    如何將單一輸入欄位設定為分區輸入?
    將輸入欄位設為分區輸入有多種方法可用於建立一系列分區輸入欄位。一種方法利用「字母間距」來分隔單一輸入欄位內的字元。此外,「background-image」和「border-bottom」樣式可以進一步增強多個輸入欄位的錯覺。 CSS Snippet以下 CSS 程式碼示範如何建立所需的效果:#pa...
    程式設計 發佈於2024-11-05
  • 用 Go 建構一個簡單的負載平衡器
    用 Go 建構一個簡單的負載平衡器
    负载均衡器在现代软件开发中至关重要。如果您曾经想知道如何在多个服务器之间分配请求,或者为什么某些网站即使在流量大的情况下也感觉更快,答案通常在于高效的负载平衡。 在这篇文章中,我们将使用 Go 中的循环算法构建一个简单的应用程序负载均衡器。这篇文章的目的是逐步了解负载均衡器的工作原理。 ...
    程式設計 發佈於2024-11-05
  • 如何以超連結方式開啟本機目錄?
    如何以超連結方式開啟本機目錄?
    透過超連結導航本地目錄嘗試在連結互動時啟動本地目錄視圖時,您可能會遇到限制。然而,有一個解決方案可以解決這個問題,並且可以在各種瀏覽器之間無縫運作。 實作方法因為從HTML 頁面直接開啟路徑或啟動瀏覽器是由於安全原因受到限制,更可行的方法是提供可下載的連結( .URL 或.LNK)。 建議路徑:.U...
    程式設計 發佈於2024-11-05
  • 為什麼 Makefile 會拋出 Go 指令的權限被拒絕錯誤?
    為什麼 Makefile 會拋出 Go 指令的權限被拒絕錯誤?
    在執行Go 時Makefile 中出現權限被拒絕錯誤透過Makefile 執行Go 指令時可能會遇到「權限被拒絕」錯誤,即使你可以直接執行它們。這種差異是由於 GNU make 中的問題引起的。 原因:當您的 PATH 上有一個目錄包含名為“go.gnu”的子目錄時,就會出現此錯誤。 ”例如,如果您...
    程式設計 發佈於2024-11-05
  • parseInt 函數中 Radix 參數的意義是什麼?
    parseInt 函數中 Radix 參數的意義是什麼?
    parseInt 函數中 Radix 的作用parseInt 函數將字串轉換為整數。然而,它並不總是採用以 10 為基數的數字系統。若要指定所需的基數,請使用基數參數。 理解基數基數是指單一數字表示的值的數量。例如,十六進制的基數為 16,八進制的基數為 8,二進制的基數為 2。 為什麼要用基數? ...
    程式設計 發佈於2024-11-05
  • 如何使用 JavaScript 將連結保留在同一選項卡中?
    如何使用 JavaScript 將連結保留在同一選項卡中?
    在同一分頁和視窗中導覽連結您可能會遇到想要在同一視窗和分頁中開啟連結的情況作為當前頁面。但是,使用 window.open 函數通常會導致在新分頁中開啟連結。為了解決這個問題,您可以使用name 屬性,如下所示:window.open("https://www.youraddress.co...
    程式設計 發佈於2024-11-05
  • 如何解決Python中的循環依賴?
    如何解決Python中的循環依賴?
    Python 中的循環依賴使用 Python 模組時遇到循環依賴可能是一個令人沮喪的問題。在這個特定場景中,我們有兩個文件,node.py 和 path.py,分別包含 Node 和 Path 類別。 最初,path.py 使用 from node.py import * 導入 node.py。但是...
    程式設計 發佈於2024-11-05
  • MariaDB 與 MySQL:開發人員需要了解什麼
    MariaDB 與 MySQL:開發人員需要了解什麼
    MariaDB 和 MySQL 是著名的開源 RDBMS,但儘管它們有著共同的歷史,但它們在功能和效能方面卻有所不同。本文快速強調了主要差異,幫助開發人員決定哪個資料庫最適合他們的需求。 差異和範例 儲存引擎,MariaDB 對 Aria 和 MyRocks 等引擎的擴充支援提供了...
    程式設計 發佈於2024-11-05
  • 為什麼我的 Goroutine 遞增變數會產生意外的結果?
    為什麼我的 Goroutine 遞增變數會產生意外的結果?
    這是編譯器最佳化的結果嗎? 在此程式碼片段中,啟動了一個 goroutine 並重複遞增變數 i:package main import "time" func main() { i := 1 go func() { for { ...
    程式設計 發佈於2024-11-05
  • 利用 AI 快速學習 Node.js - 第 4 天
    利用 AI 快速學習 Node.js - 第 4 天
    今天,借助ChatGPT繼續學習Node.js,重點是非同步程式設計。這是 Node.js 中最重要的概念之一,我很高興能夠開始掌握它。 理論 在 Node.js 中,非同步程式設計因其非阻塞、事件驅動的架構而至關重要。這意味著文件讀取、資料庫查詢或網路請求等操作在等待結果時不會阻塞其他程式碼的執...
    程式設計 發佈於2024-11-05
  • Java 可以定義帶有嵌入引號的字串而不轉義嗎?
    Java 可以定義帶有嵌入引號的字串而不轉義嗎?
    揭開Java 使用嵌入式引號定義字串的替代方法在Java 中處理字串時,您常常會在文字中遇到大量引號,導致繁瑣的轉義和可讀性挑戰。雖然其他語言提供了處理這種情況的語法,但 Java 缺乏類似的選項。 問題: Java 是否提供了另一種方法來定義帶有嵌入引號的字串而不訴諸轉義? 答案: 雖然Java ...
    程式設計 發佈於2024-11-05
  • 耐用的 Python:建立防彈的長期運作工作流程,變得簡單
    耐用的 Python:建立防彈的長期運作工作流程,變得簡單
    在现代软件开发中,创建强大的工作流程来连接来自各种服务的 API 并处理同步和异步事件是一个常见的挑战。传统方法涉及使用队列、微服务和状态管理系统的组合来构建可扩展的应用程序。虽然有效,但这种架构带来了巨大的开销:设置和维护消息队列等基础设施、运行服务器或 lambda 函数、管理数据库中的状态以及...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3