MySQL之Schema與數據類型優化和創建高性能的索引(一)

Schema與數據類型優化

只修改.frm文件

從前面的例子中可以看到修改表的.frm文件是很快的,但MySQL有時候會在沒有必要的時候也重建.如果愿意冒一些風險,可以讓MySQL做一些其他類型的修改而不用重建表。下面這些操作是有可能不需要重建表的:

  • 1.移除(不是增加)一個列的AUTO_INCREMENT屬性
  • 2.增加、移除,或更改ENUM和SET常量。如果移除的是已經有行數據用到其值的變量,查詢將會返回一個空字符串

基本的技術是為想要的表結構創建一個新的.frm文件,然后用它替換掉已經存在的那張表的.frm文件,像下面這樣:

  • 1.創建一張有相同結構的空表,并進行所需要的修改(例如增加ENUM常量)
  • 2.執行FLUSH TABLES WITH READ LOCK.這將會關閉所有正在使用的表,并且進制任何表被打開
  • 3.交換.frm文件
  • 4.執行UNLOCK TABLES來釋放第2步的讀鎖
    下面以給sakila.film表的rating列增加一個常量為例來說明。當前列看起來如下
mysql> SHOW COLUMNS FROM film LIKE 'rating';
+--------+------------------------------------+------+-----+---------+-------+
| Field  | Type                               | Null | Key | Default | Extra |
+--------+------------------------------------+------+-----+---------+-------+
| rating | enum('G','PG','PG-13','R','NC-17') | YES  |     | G       |       |
+--------+------------------------------------+------+-----+---------+-------+
1 row in set (0.07 sec)

假設我們需要為那些對電影更加謹慎的父母們增加一個PG-14的電影分級:

mysql> CREATE TABLE film_new LIKE film;
Query OK, 0 rows affected (0.03 sec)mysql> ALTER TABLE film_new-> MODIFY COLUMN rating ENUM('G','PG','PG-13','R','NC-17','PG-14')-> DEFAULT 'G';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.02 sec)

注意,我們是在常量列表的末尾增加一個新的值。如果把新增的值放在中間,例如PG-13之后,則會導致已經存在的數據的含義被改變:已經存在的R值將變成PG-14,而已經存在的NC-17將變成R,等等。
接下來用操作系統的命令交換.frm文件

/var/lib/mysql/sakila# mv film.frm film_tmp.film
/var/lib/mysql/sakila# mv film_new.frm film.frm
/var/lib/mysql/sakila# mv film_tmp.frm film_new.frm

再回到MySQL 命令行,現在可以解鎖表并且看到變更后的效果了:

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (18.96 sec)
mysql> SHOW COLUMNS FROM film LIKE 'rating';
+--------+--------------------------------------------+------+-----+---------+-------+
| Field  | Type                                       | Null | Key | Default | Extra |
+--------+--------------------------------------------+------+-----+---------+-------+
| rating | enum('G','PG','PG-13','R','NC-17','PG-14') | YES  |     | G       |       |
+--------+--------------------------------------------+------+-----+---------+-------+
1 row in set (0.09 sec)

最后要做的事刪除為完成這個操作而創建的輔助表:

mysql>DROP TABLE film_new;

快速創建MyISAM索引

為了高效地載入數據到MyISAM表中,有一個常用的技巧是先禁用索引、載入數據,然后重新啟用索引:

mysql>ALTER TABLE test.load_data DISABLE KEYS;
mysql>ALTER TABLE test.load_data ENABLE KEYS;

這個技巧能夠發揮作用,是因為構建索引的工作被延遲到數據完全載入以后,這個時候已經可以通過排序來構建索引了,這樣做會快很多,并且使得索引樹的碎片更少、更緊湊。
不幸的是,這個辦法對唯一索引無效,因為DISABLE KEYS只對非唯一索引有效。MyISAM會在內存中構造唯一索引,并且為載入的每一行檢查唯一性。一旦索引的大小超過了有效內存大小,載入操作就會變得越來越慢。
在現代版本的InnoDB版本中,有一個類似的技巧,這依賴于InnoDB的快速在線索引創建功能。這個技巧是,先刪除所有的非唯一索引,然后增加新的列,最后重新創建刪除掉的索引。Percona Server可以自動完成這些操作步驟。也可以使用像前面說的ALTER TABLE的駭客方法來加速這個操作,但需要多做一些工作并且承擔一定的風險。這對備份中載入數據是很有用的,例如,當已經直到所有的數據都是有效的并且沒有必要做唯一性檢查就可以這么來操作。
下面是操作步驟:

  • 1.用需要的表結構創建一張表,但是不包括索引。
  • 2.載入數據到表以后構建.MYD文件
  • 3.按照需要的結構創建另外一張空表,這次要包含索引。這回創建需要的.frm和.MYI文件
  • 4.獲取讀鎖并刷新表
  • 5.重命名第二張表的.frm和MYI文件,讓MySQL認為是第一張表的文件
  • 6.釋放讀鎖
  • 7.使用REPAIR TABLE來重建表的索引。該操作會通過排序來構建所有索引,包括唯一索引

創建高性能的索引

概述。

索引(在MySQL中也叫做"鍵(key)")是存儲引擎用于快速找到記錄的一種數據結構。這是索引的基本功能。
索引對于良好的性能非常關鍵。尤其是當表中的數據量越來越大時,索引對性能的影響語法重要。在數據量較小時負載較低時,不恰當的索引對性能的影響可能還不明顯,但當數據量逐漸增大時,性能則會急劇下降(除非特別說明,假設都是硬盤驅動器。固態硬盤驅動器有著完全不同的性能特性)。不過,索引卻經常被忽略,有時候甚至被誤解,所以在實際案例中經常會遇到由糟糕索引導致的問題。索引優化應該是對查詢性能優化是最有效的手段,索引能夠輕易將查詢性能提高幾個數量級,"最優"的索引有時比一個"好的"索引性能要好兩個數量級。創建一個真正“最有”的索引經常需要重寫查詢

索引基礎

在MySQL中,存儲引擎用類似的方法使用索引,其先在索引中找到對應值,然后根據匹配的索引記錄找到對應的數據行。假如要運行下面的查詢:

mysql> SELECT first_name FROM actor WHERE actor_id = 5;

如果在actor_id列上建有索引,則MySQL將使用該索引找到actor_id為5的行,也就是說,MySQL先在索引上按值進行查找,然后返回所有包含該值的數據行。索引可以包含一個或者多個列的值。如果索引包含多個列,那么列的順序也十分重要,因為MySQL只能高效地使用索引的最左前綴列,創建一個包含兩個列的索引,和創建兩個只包含一列的索引是大不相同的。

如果使用的是ORM,是否還需要關心索引?

簡而言之:是的,仍然需要理解索引,即使是適用對象關系映射(ORM)工具。
ORM工具能夠生產符合邏輯的、合法的查詢(多數時候),除非只是生成非常基本的查詢(例如僅是根據主鍵查詢),否則它很難生成適合索引的查詢。無論是多個復雜的ORM工具,在精妙和復雜的索引面前都是"浮云"。很多時候,即使是查詢優化技術專家也很難兼顧到各種情況,更別說ORM了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15797.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15797.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15797.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaEE-文件IO2

文章目錄 前言一、字節流1.1 讀文件1.2 寫文件 二、字符流2.1 讀文件2.2 寫文件 三、文件IO三道例題 前言 在這里對Java標準庫中對文件內容的操作進行總結,總體上分為兩部分,字節流和字符流,就是以字節為單位讀取文件和以字符為單位讀取文件…

[AI Google] 介紹 VideoFX,以及 ImageFX 和 MusicFX 的新功能

VideoFX 是來自 labs.google 的最新實驗,您可以查看音樂效果和圖像效果的新更新,現在在 110 多個國家可用。 生成式媒體正在改變人們構思創意并增強我們的創造力能力的方式。我們致力于與創作者和藝術家合作構建人工智能,以更好地理解這些生成…

cmake使用交叉編譯工具鏈并驗證

目錄 一、內容 二、配置 1. 準備cmake文件 2. 使用交叉編譯 三、驗證 1. 構建階段驗證 2. 編譯階段驗證 一、內容 目的:在X86環境下編譯ARM平臺軟件 編寫交叉編譯配置文件:xx.cmake 執行cmake命令時指定:cmake \ -DCMAKE_TOOLCHAIN_F…

Linux Crontab:看完這篇,還有啥不懂的嗎

在Linux系統管理中,自動化是一個至關重要的概念,它可以幫助我們節省時間、減少錯誤并提高效率。crontab> 是實現這一目標的強大工具,它允許我們安排任務在特定的時間自動執行。本文將詳細介紹 crontab 的基礎概念、語法、命令、高級技巧以…

K8S認證|CKA題庫+答案| 12. 查看Pod日志

目錄 12、查看Pod日志 CKA v1.29.0模擬系統免費下載試用: 題目: 開始操作: 1)、切換集群 2)、提取錯誤日志 3)、驗證提取結果 12、查看Pod日志 CKA v1.29.0模擬系統免費下載試用: 百度…

簡單的UDP網絡程序:多人群聊系統

本章重點 能夠實現一個簡單的udp客戶端/服務器; 1.創建套接字 我們把服務器封裝成一個類,當我們定義出一個服務器對象后需要馬上初始化服務器,而初始化服務器需要做的第一件事就是創建套接字。 ?參數說明: domain:創建套接字的域…

Nginx代理配置(專業版)

寫在前面提醒:使用代理,如果可以,請盡量支持雙協議,http、https均要支持哈。 注意:監控系統只是運行代碼,是否支持https,需要運維同學在你們的服務器上配置https證書,配置好證書&…

在 CentOS 上安裝 PostgreSQL 的全面指南

PostgreSQL 是一種功能強大的開源關系型數據庫管理系統,廣泛應用于各種領域。它提供了諸如事務處理、并發控制和數據完整性等高級功能,因此深受開發者和企業的歡迎。本指南將逐步引導您在 CentOS 上安裝 PostgreSQL,以便您充分利用其眾多優勢…

決定了,將ChatGPTer開源!主打一個大模型人人可用。

一個快速上手且極易部署的類ChatGPT開源應用,可接入 OPENAI API 或 通義千問API 開源地址: https://github.com/isnl/EsChat 大聲(偷偷)告訴你:通義千問有免費API額度可白嫖!!! 版本特性 OPENAI 和 通義千…

點云AABB、OBB包圍盒計算顯示

目錄 一、簡介 1)AABB包圍盒 2)OBB包圍盒 二、計算代碼 三、加載計算結果

什么是Promise

Promise 是 JavaScript 中的一個對象,用于處理異步操作。它代表了一個最終可能完成(也可能被拒絕)的異步操作及其結果值。Promise 對象用于更復雜的異步編程模式,包括使用 .then() 和 .catch() 鏈式調用來處理異步操作的結果。 P…

算法提高之區間最大公約數

算法提高之區間最大公約數 核心思想&#xff1a;線段樹 1.在區間上加一個數 差分 2.求一段區間的最gcd 求[l,r]的gcd 可以拆解為求**[1,l].sum(差分數組 求出來時l點的值)和[l1,r]**做gcd #include <iostream>#include <cstring>#include <algorithm>usi…

1738. 找出第 K 大的異或坐標值

1738. 找出第 K 大的異或坐標值 題目鏈接&#xff1a;1738. 找出第 K 大的異或坐標值 代碼如下&#xff1a; //列前綴異或和 //參考鏈接:https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/solutions/2790359/liang-chong-fang-fa-er-wei-qian-zhui-yi-68…

Docker數據卷(volume)

數據卷 數據卷是一個虛擬目錄&#xff0c;是容器內目錄與宿主機目錄之間映射的橋梁。&#xff08;容器內目錄與宿主機目錄對應的橋梁&#xff0c;修改宿主機對應的目錄&#xff0c;docker會映射到容器內部&#xff0c;相當于修改了容器內的&#xff0c;反之也一樣&#xff09;數…

利用英特爾 Gaudi 2 和至強 CPU 構建經濟高效的企業級 RAG 應用

檢索增強生成 (Retrieval Augmented Generation&#xff0c;RAG) 可將存儲在外部數據庫中的新鮮領域知識納入大語言模型以增強其文本生成能力。其提供了一種將公司數據與訓練期間語言模型學到的知識分開的方式&#xff0c;有助于我們在性能、準確性及安全隱私之間進行有效折衷。…

任推邦:實力強勁的APP推廣拉新平臺,號稱不扣量

任推邦簡介 任推邦是國內數一數二的項目分發平臺&#xff0c;也是一個不扣量的項目APP推廣拉新平臺&#xff0c;隸屬于聚名科技集團股份有限公司。聚名科技成立時間在2012年&#xff0c;是安徽省老牌互聯網企業&#xff0c;歷經11年的飛速發展&#xff0c;聚名科技成功布局打造…

小程序的這些知識你知道嗎?

一:導航傳參 無論是編程式還是聲明式導骯傳參都是在url?keyvalue&key1value1,無論是否是tabbar頁面. 對于回退頁面,沒辦法傳參. 這個參數是,跳轉到頁面的時候,跳轉到另一個頁面,這個頁面就是剛開始執行,等數據執行之后,觸發onload,傳遞的參數放在內存中,跳轉是內部底層觸…

云端力量:利用移動云服務器高效部署Spring Boot Web應用

文章目錄 一、移動云介紹二、移動云產品選擇三、體驗云主機ECS四、使用移動云服務器部署SpringBoot Web應用4.1移動云ECS安裝JDK4.2移動云ECS安裝MySQL4.3移動云ECS數據庫插入數據4.4移動云ECS部署Spring Boot Web應用 總結 一、移動云介紹 移動云是中國移動基于自研的先進技術…

Linux中常見的基本指令(上)

目錄 一、ls指令 1. ls 2. ls -l 3. ls -a 4.ls -F 二、qwd指令 三、cd指令 1. cd .. 2. cd / / / 3. cd ../ / / 4. cd ~ 5. cd - 五、mkdir指令 六、rmdir指令和rm指令 一、ls指令 語法 &#xff1a; ls [ 選項 ][ 目錄或文件 ] 。 功能 &#xff1a;對于目錄…

桶排序和基數排序

前言&#xff1a; 這篇文章&#xff0c;我們就來了解一些鮮為人知的排序&#xff0c;桶排序和基數排序。 桶排序&#xff1a; 桶排序的思想&#xff1a; 桶排序的思想就是把待排序的數盡量均勻地放到各個桶中&#xff0c;再對各個桶進行局部的排序&#xff0c;最后再按序將各…