MySQL資料庫索引簡介

来源:https://www.cnblogs.com/maybechen/archive/2018/03/16/8580542.html
-Advertisement-
Play Games

一、索引的含義和特點 索引是一個單獨的、存儲在磁碟上的資料庫結構,他們包含著對數據表裡所有記錄的引用指針。使用索引用於快速找出某個或多個列中有一特點值的行,所用MySQL列類型都可以被索引,對相關列使用索引是提高查詢操作速度的最佳途徑。 索引是在儲存引擎中實現的,因此,每種存儲引擎的索引都不一定完全 ...


一、索引的含義和特點     索引是一個單獨的、存儲在磁碟上的資料庫結構,他們包含著對數據表裡所有記錄的引用指針。使用索引用於快速找出某個或多個列中有一特點值的行,所用MySQL列類型都可以被索引,對相關列使用索引是提高查詢操作速度的最佳途徑。     索引是在儲存引擎中實現的,因此,每種存儲引擎的索引都不一定完全相同,並且每種存儲引擎也不一定支持所有索引類型。根據存儲引擎定義每個表的最大索引數和最大索引長度。所有存儲殷勤支持每個表至少16個索引,總索引長度至少為256位元組。大多數存儲引擎有更高的限制。MySQL中索引的存儲類型有兩種:BTREE和HASH,具體和表的存儲引擎相關:MyISAM和InnoDB存儲殷勤只支持BTREE索引;MEMORY/HEAP存儲引擎可以支持HASH和BTREE索引。     索引的優點主要有:     (1)通過創建唯一索引,可以保證資料庫表中每一行數據的唯一性。     (2)可以大大加快數據的查詢速度。     (3)在實現數據的參考完整性方面,可以加速表和表之間的連接。     (4)在使用分組和排序子句進行數據查詢時,也可以顯著減少查詢中分組和排序的時間。     索引的缺點主要有:     (1)創建索引和維護索引要耗費時間,並且隨著數據量的增加所耗費的時間也會增加。     (2)索引需要占磁碟空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果有大量的索引,索引文件可能比數據文件更快達到最大文件尺寸。     (3)當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。   二、索引的分類     MySQL的索引可以分為以下幾類:     1、普通索引和唯一索引     普通索引是MySQL中的基本索引類型,允許在定義索引的列中插入重覆值和空值。     唯一索引,索引列的值必須唯一,單允許有空值。如果是組合索引,則列值的組合必須唯一。主鍵索引是一種特殊的唯一索引,不允許有空值。     2、單列索引和組合索引     單列索引即一個索引只包含單個列,一個表可以有多個單個索引。     組合索引指在表的多個欄位組合上創建的索引,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用。使用組合索引時遵循最左首碼集合。     3、全文索引     全文索引類型為FULLTEXT,在定義索引的列上支持值得全文查找,允許在這些索引列中插入重覆值和空值。全文索引可以在CHAR、VARCHAR或者TEXT類型的列上創建。MySQL中只有MyISAM存儲引擎支持全文索引。     4、空間索引     空間索引是對空間數據類型的欄位建立的索引,MySQL中的空間數據類型有4中,分別是:GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL關鍵字進行擴展,使用能夠用於創建正規索引類似的語法創建空間索引。創建空間索引的列,必須將其聲明為NOT NULL,空間索引只能在存儲引擎為MyISAM的表中創建。   三、索引的設計原則     索引設計不合理或者缺少索引都會對資料庫和應用程式的性能造成障礙。高效的索引對於獲得良好的性能非常重要。     設計索引時,應該考慮的一些準則:     (1)索引並非越多越好,一個表中如有大量的索引,不僅占用磁碟空間,而且會影響INSERT、DELETE、UPDATE等語句的性能,因為表中的數據更改的同時,索引也會進行調整和更新。     (2)避免對經常更新的表進行過多的索引,並且索引中的列儘可能少。而對經常用於查詢的欄位應該創建索引,單要避免添加不必要的欄位。     (3)數據量小的表最好不要使用索引,由於數據較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。     (4)在條件表達式中經常用到的不同值較多的列建立索引,在不同值少的列上不要建立索引。比如在學生表的“性別”欄位上只有“男”和“女”兩個不同值,因此就無須建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重較低更新速度。     (5)當唯一性是某種數據本身的特征時,指定唯一索引。使用唯一索引需能確保定義的列的數據完整性,以提高查詢速度。     (6)在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。   四、創建索引     1、創建表的時候創建索引     使用CREATE TABLE創建表時,除了可以定義列的數據類型,還可以定義主鍵約束、外鍵約束或者唯一約束,而不論創建那種約束,在定義約束的同時相當於在指定列上創建了一個索引。     (1)創建普通索引     最基本的索引類型,沒有唯一性之類的限制,其作用只是加快對數據的訪問速度。     eg:     CREATE TABLE book (         bookid INT NOT NULL,         bookname VARCHAR(255) NOT NULL,         authors VARCHAR(255) NOT NULL,         info VARCHAR(255),         comment VARCHAR(255),         year_publication YEAR NOT NULL,         INDEX(year_publication)     );       (2)創建唯一索引     創建索引的主要原因是減少查詢索引列操作的時間,尤其是對比較龐大的數據表。它與前面的普通索引類似,不同就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值得組合必須唯一。     eg:     CREATE TABLE t1 (         id INT NOT NULL,         name CHAR(30) NOT NULL,         UNIQUE INDEX UniqIdx(id)     );       (3)創建單列索引     單列索引是在數據表中的某一個欄位上創建的索引,一個表可以闖將多個單列索引。上面兩個例子中創建都是單列索引。     eg:     CREATE TBALE t2 (         id INT NOT NULL,         name CHAR(50),         INDEX SingleIdx(name(20)) ----名為SingleIdx的單列索引,索引長度為20     );       (4)創建組合索引     組合索引是在多個欄位上創建一個索引。     eg:     CREATE TABLE t3 (         id  INT NOT NULL,         name CHAR(30) NOT NULL,         age INT NOT NULL,         info VARCHAR(255),         INDEX MultiIdx(id, name, age(100))     );     組合索引可起幾個索引的作用,但是使用時並不是隨便查詢那個欄位都可以使用索引,而是遵從“最左首碼”:利用索引中最左邊的列集類匹配行,這樣的列集稱為最左首碼。例如這裡由id、name和age3個欄位構成的索引,索引行中按id/name/age的順序存放,索引可以搜索下麵欄位組合:(id,name, age)、(id,name)或者id,如果列不構成索引最左面的首碼,MySQL不能使用局部索引,如(age)或者(name,age)組合不能使用索引查詢。       (5)創建全文索引     FULLTEXT全文索引可以用於全文搜索。只用MyISAM存儲引擎支持FULLTEXT索引,並且只為CHAR、VARCHAR和TEXT列。索引總是對整個列進行,不支持局部(首碼)索引。     eg:     CREATE TABLE t4 (         id INT NOT NULL,         name CHAR(30) NOT NULL,         age INT NOT NULL,         info VARCHAR(255),         FULLTEXT INDEX FullTxtIdx(info)     ) ENGINE=MyISAM;       (6)創建空間索引     空間索引必須在MyISAM類型的表中創建,且空間類型的欄位必須為非空。     eg:     CREATE TABLE t5 (         g GEOMETRY NOT NULL,         SPATIAL INDEX spatIdx(g)      ) ENGINE=MyISAM;          2、在已經存在的表上創建索引       在已經存在的表中創建索引,可以使用ALTER TABLE或者CREATE INDEX語句。       使用ALTER TABLE語句:        ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name](col_name[length],...)[ASC|DESC]       使用CREATE INDEX語句:        CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name(col_name[length,...)[ASC|DESC]   三、刪除索引     使用ALTER TABLE語句刪除索引:      ALTER TABLE table_name DROP INDEX index_name;     使用DROP INDEX語句刪除索引:      DROP INDEX index_name ON table_name;   四、查看索引     SHOW INDEX FROM table_name;     SHOW KEYS FROM table_name;  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 此方法不需要修改Tomcat配置 親測,可用 1.在tomcat bin目錄下添加文件clear_log.sh 內容如下: #!/bin/shd=`date +%Y-%m-%d`d7=`date -d'7 day ago' +%Y-%m-%d`cp /opt/apache-tomcat-8.5.9/ ...
  • 1、列出當前系統上所有已經登錄的用戶的用戶名,註意:同一個用戶登錄多次,則只顯示一次即可。 2、取出最後登錄到當前系統的用戶的相關信息。 3、取出當前系統上被用戶當作其預設shell的最多的那個shell。 4、將/etc/passwd中的第三個欄位數值最大的後10個用戶的信息全部改為大寫後保存至/ ...
  • 1.虛擬機把磁碟大小進行改動 2.sudo apt-get install gparted 3.打開安裝好的應用 4.進行分區改動 5.理論刪除sda2和sda5重整後邊即可,但此時sda2和sda5可能會處在啟用交互的狀態: 6.右鍵禁止後依次刪除sda5和sda2,重新分配sda1後,把預留的位 ...
  • 一、高通sensor架構: linux驅動由淺入深系列:高通sensor架構實例分析之一(整體概覽+AP側代碼分析) linux驅動由淺入深系列:高通sensor架構實例分析之二(adsp驅動代碼結構) Linux驅動由淺入深系列:高通sensor架構實例分析之三(adsp上報數據詳解、校準流程詳解 ...
  • 一、概述 本篇文章轉載來著官網線上文檔,文章主要介紹SQL Server數據類型轉換相關語法、隱式轉換、Date樣式等。 語法 Syntax for CAST: CAST ( expression AS data_type [ ( length ) ] ) Syntax for CONVERT: C ...
  • window eclipse連接hadoop集群,本地運行wordcount,報以下錯誤,嘗試網路上的方法無果,如:換64JDK,添加hadoop_home,path,以及在hadoop\bin和c:\windows\system32下放hadoop.dll。 解決:刪除hadoop\bin\had ...
  • 在MySQL中,它是按什麼順序或規律去讀取my.cnf配置文件的呢?其實只要你花一點功夫,實驗測試一下就能弄清楚,下麵的實驗環境為5.7.21 MySQL Community Server。其它版本如有不同,請以實際情況為準。 其實,MySQL是按照下麵這個順序來讀取my.cnf: 1: /etc/... ...
  • 一、環境 二、官方源 獲取官方源: 安裝: 安裝之後, /etc/yum.repos.d/目錄下會產生兩個文件:mysql-community-source.repo、mysql-community.repo。 三、創建組和用戶 四、安裝MySQL 由於RHEL7.3中預設安裝了Mariadb,安裝 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...