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

MySQL數(shù)據(jù)庫中的索引(含SQL語句)

這篇具有很好參考價值的文章主要介紹了MySQL數(shù)據(jù)庫中的索引(含SQL語句)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

為什么要用索引

假設有一張表,表中有100萬條數(shù)據(jù),這100萬條數(shù)據(jù)在硬盤上是存儲在數(shù)據(jù)頁上的,一頁數(shù)據(jù)大小為16k。存儲100萬條數(shù)據(jù)那么就需要數(shù)據(jù)頁,假設其中有一條數(shù)據(jù)是“id為7900”的,那么如果要查詢這條數(shù)據(jù),其中SQL是SELECT * FROM 表名 WHERE id = 7900。在執(zhí)行這條SQL語句的時候,MySQL需要掃描全表來查詢id = 7900的記錄。
全表掃描就是從“數(shù)據(jù)頁1”開始,向后逐頁查詢。對于少量數(shù)據(jù)來說,查詢的速度會很快,但是,當隨著數(shù)據(jù)量的增加,性能會急劇下降。100萬條數(shù)據(jù)進行逐頁查詢的時間是無法被用戶所接受的。

索引是什么

索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結構
是排好序的快速查找的數(shù)據(jù)結構。

索引就是類似于書的目錄。

數(shù)據(jù)庫在存儲數(shù)據(jù)本身以外,還有維護著一個滿足特定查找算法的數(shù)據(jù)結構,這些數(shù)據(jù)結構就以某種方式指向數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結構的基礎上實現(xiàn)高級查找算法,這種數(shù)據(jù)結構就是索引

索引的原理

索引的目的在于提高查詢效率,與我們查詢圖書所用的目錄是一個道理:先定位到章,然后定位到該章下的一個小節(jié),然后找到頁數(shù)。相似的例子還有:查字典、查火車車次,飛機航班等。

本質上都是:通過不斷地縮小想要獲取數(shù)據(jù)的范圍來篩選出最最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們就可以總是用同一種查找方式來鎖定數(shù)據(jù)。

索引類似于書的目錄,在一本書前面加上目錄,查找內容時就不必逐頁翻閱就能夠快速地找到所要查找的內容。借助索引,執(zhí)行查詢時就不必掃描整個表就能夠快速地找到所需要的數(shù)據(jù)。

優(yōu)點

索引提高了數(shù)據(jù)檢索的效率,降低了數(shù)據(jù)庫IO成本。

通過索引列對數(shù)據(jù)進行排序,降低了數(shù)據(jù)排序的成本,降低了CPU的消耗。

缺點

實際上,索引本質上也是一張表,這個表保存了主鍵與索引之間的字段,并指向實體表的記錄,所以索引列也是要占用磁盤的空間。

雖然索引大大提高了插敘的速度,但同時也會降低更新表數(shù)據(jù)的速度。例如:INSERT、UPDATE和DELETE,因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存一次索引文件,每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息。

創(chuàng)建索引的原則

索引雖好,但也不能亂用。

什么情況下需要索引

  1. 主鍵自動建立唯一索引。
  2. 頻繁作為查詢條件的字段應該創(chuàng)建索引(WHERE 后面的語句)。
  3. 查詢中與其它表關聯(lián)的字段,外鍵關系建立索引。
  4. 查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度分組中的字段。

什么情況下不需要索引

  1. 表記錄過少
  2. 經(jīng)常性的增刪改的表。雖然有提高了查詢的速度,但同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE,因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存一下索引的文件。(所以在遇到這種情況下,就會分表,分表就是將讀、寫的數(shù)據(jù)進行分離)
  3. WHERE條件里用不到的字段不會創(chuàng)建索引
  4. 數(shù)據(jù)重復且分布平均的表字段,因此應該只為最經(jīng)常查詢和最經(jīng)常排序的數(shù)據(jù)列表建立索引,某個數(shù)據(jù)列包含許多重復的內容,建立索引沒有太大的實際效果。

索引的分類

主鍵索引

就是設定主鍵后數(shù)據(jù)庫會自動建立索引,一個表只能有一個主鍵。

ALTER TABLE 表名 ADD PRIMARY KEY 表名(列名);

刪除主鍵索引:

ALTER TABLE 表名 DROP PRIMARY KEY;

單值索引

就是一個索引只包含單個列,一個表可以有多個單列索引。
加這個索引肯定是比不加索引要快的。

創(chuàng)建單值索引:

CREATE INDEX 索引名 ON 表名(列名);

刪除索引:

DROP INDEX 索引名;

唯一索引

索引列的值必須唯一,允許為null;

CREATE UNIQUE INDEX 索引名 ON 表名 (列名);

刪除索引:

DROP INDEX 索引名 ON 表名;

組合索引(復合索引)

即一個索引包含多個列,在數(shù)據(jù)庫操作期間,復合索引比單值索引所需要的開銷是更小的(對于相同的多個列鍵索引)。

當表的行數(shù)遠大于索引列的數(shù)目時可以使用復合索引。

創(chuàng)建復合索引

CREATE INDEX 索引名 ON 表名(列1,列2,…);

刪除索引

DROP INDEX 索引名 ON 表名;

組合索引最左前綴原則
例如表中有a,b,c 3列,為a,b兩列創(chuàng)建組合索引,那么在使用時需要滿足最左側索引原則。即在使用組合索引的列為條件的時候,是必須要出現(xiàn)最左側列作為條件,否則索引是不生效的。

例如:

SELECT * FROM 表名 WHERE a = ' ' AND b = ' ' ; #索引生效
SELECT * FROM 表名 WHERE b = ' ' AND b = ' ' ; #索引生效
SELECT * FROM 表名 WHERE a = ' ' AND b = ' ' ; # 索引生效
SELECT * FORM 表名 WHERE b = ' ' AND c = ' ' ; # 索引不生效

全文索引(僅在MySQL8之后有)

是需要模糊查詢的,一般索引是無效的,這個時候就可以使用全文索引。

比如: WHERE name LIKE %J%,這樣查詢的時候,即使name列添加了索引,但也會索引失效的。所以是不建議使用的,在MySQL8當中就建議使用全文索引。

創(chuàng)建全文索引列:

CREATE FULLTEXT INDEX 索引名 ON 表名(列名) WITH TARSER ngram;

使用全文索引:

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST(‘輸入的參數(shù)’);

全文索引的插敘效率是比使用LIKE來查詢要快的,所以在MySQL8之后是建議使用全文索引的。

查找索引:

SHOW INDEX FROM 表名;

索引的數(shù)據(jù)結構

在MySQL數(shù)據(jù)庫中的InnoDB引擎是使用B+樹來進行數(shù)據(jù)存儲的。

B+樹由二叉查找樹、平衡二叉樹(AVLTree)和平衡多落查找樹(B-Tree)逐步優(yōu)化而來的。使其更適合實現(xiàn)外存索引結構。

B+數(shù)的特點:

  1. 它是排好序的,一個節(jié)點可以存儲多個數(shù)據(jù)。
  2. 非葉子節(jié)點是不存儲數(shù)據(jù)的,只存儲索引,是可以放更多的索引。
  3. 數(shù)據(jù)都是存放在在葉子節(jié)點中的。
  4. 所有的葉子節(jié)點之間都是有一個鏈指針的。

就是使用B+樹使得樹是橫向擴展的,讓樹的高度降低了。在葉子節(jié)點也可以存儲多個數(shù)據(jù)。
MySQL數(shù)據(jù)庫中的索引(含SQL語句)

MySQL所以使用B+樹,因為索引是用來加快查詢的,而B+數(shù)通過對數(shù)據(jù)進行排序所以是可以提高查詢速度,然后通過一個節(jié)點可以存儲多個元素,從而可以使得B+樹的高度不會太高。并且葉子節(jié)點之間存在指針,可以很好的支持全表掃描,范圍查找等SQL語句。

聚簇索引和非聚簇索引

聚簇索引
就是找到了索引就找到了需要的數(shù)據(jù),那么這個索引就是聚簇索引,所以主鍵就是聚簇索引。

非聚簇索引
索引的存儲和數(shù)據(jù)的存儲時分離的,也就是意味著找到了索引但沒有找到數(shù)據(jù),需要根據(jù)索引上的值(主鍵)再次回表查詢,非聚簇索引也叫做輔助索引。

舉例:
先創(chuàng)建一個表,用來說明說明情況下是聚簇索引和非聚簇索引:

CREATE TABLE student (
  `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `name` VARCHAR (50) COMMENT '學生姓名',
  `age` INT NOT NULL DEFAULT 0 COMMENT '學生年齡',
  KEY `idx_name` (`name`)
)

創(chuàng)建的數(shù)據(jù)庫表中,主鍵id是一個索引,給age添加了索引。

① 直接根據(jù)主鍵查詢獲取所有字段數(shù)據(jù),此時主鍵就是聚簇索引。因為主鍵對應的索引葉子節(jié)點存儲的就是id的所有字段值。

SELECT * FROM student WHERE id = 1;

MySQL數(shù)據(jù)庫中的索引(含SQL語句)

② 根據(jù)name查詢所有信息,name本身就是一個唯一索引,但查詢的數(shù)據(jù)包括了所有的數(shù)據(jù),所以當命中name索引的時候,該索引的節(jié)點的數(shù)據(jù)存儲的就是主鍵的ID,然后需要ID再查詢一次。
這就是非聚簇索引。

SELECT * FROM student WHERE name = “張三”;

索引就是再單獨的創(chuàng)建一張表,在這個表中查找數(shù)據(jù),然后拿到ID在返回所有數(shù)據(jù)的表中查詢所有的數(shù)據(jù)。

③ 根據(jù)name查詢的時候,我們只查詢name的值,不查詢其他的信息。這種查詢就是命中name索引,直接返回name的值,因為所需要的數(shù)據(jù)就是索引,此時不需要會表查詢。這種場景就是非聚簇索引。

SELECT name FROM student WHERE name = “張三”;


拓展
在MySQL中InnoDB引擎的索引和文件是存放在一起的,找到索引就可以找到數(shù)據(jù),是聚簇式設計。(默認是聚簇設計的,當你加上其他的索引,根據(jù)變化就成為了非聚簇式)

而MyISAM引擎采用的是非聚簇式設計,索引文件和數(shù)據(jù)文件不在同一個文件中。(不管怎么創(chuàng)建,它本質上就是非聚簇的設計)

因為在MyISAM當中,它是在MYD中存儲文件的數(shù)據(jù);在MYI中存儲文件的索引;在sdi中存儲表的結構。
MySQL數(shù)據(jù)庫中的索引(含SQL語句)文章來源地址http://www.zghlxwxcb.cn/news/detail-431134.html

到了這里,關于MySQL數(shù)據(jù)庫中的索引(含SQL語句)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【數(shù)據(jù)庫】MySQL 高級(進階) SQL 語句

    【數(shù)據(jù)庫】MySQL 高級(進階) SQL 語句

    location表格創(chuàng)建 store_info表格創(chuàng)建 顯示表格中一個或數(shù)個字段的所有數(shù)據(jù)記錄 不顯示重復的數(shù)據(jù)記錄 按照條件進行查詢 在已知的字段數(shù)據(jù)取值范圍內取值 另外還有not in命令,用法一致,表示顯示不在指定范圍內的字段的值。 在兩個字段數(shù)據(jù)值之間取值,包含兩邊字段的數(shù)據(jù)

    2024年02月09日
    瀏覽(28)
  • 【數(shù)據(jù)庫】sql server 中的sql語句--增刪改查

    上面是要建立的數(shù)據(jù)庫 下面是sql語句: ?

    2024年02月05日
    瀏覽(25)
  • 【MySQL】數(shù)據(jù)庫SQL語句之DML

    【MySQL】數(shù)據(jù)庫SQL語句之DML

    目錄 前言: 一.DML添加數(shù)據(jù) 1.1給指定字段添加數(shù)據(jù) 1.2給全部字段添加數(shù)據(jù) 1.3批量添加數(shù)據(jù) 二.DML修改數(shù)據(jù) 三.DML刪除數(shù)據(jù) 四.結尾 ? 時隔一周,啊蘇今天來更新啦,簡單說說這周在做些什么吧,上課、看書、放松等,哈哈哈,所以博客就這樣被擱了。 ? 今天感覺不錯,給大

    2024年02月08日
    瀏覽(95)
  • MySQL相關的SQL語句、數(shù)據(jù)庫、數(shù)據(jù)表、字段、類型

    1、 SQL 語句不區(qū)分大小寫。 SQL語句 用途 描述 mysql -u root -p 連接 MySQL 在命令行窗口中輸入 mysql -u root -p 命令,回車,然后輸入 MySQL 密碼(不要忘記了密碼,找回麻煩),再回車就連接上 MySQL 了。最初都是使用 root 用戶登錄,工作中不能一直使用 root 用戶登錄。因為 root 權限太

    2024年02月13日
    瀏覽(115)
  • mysql,用sql語句,建立學生-課程數(shù)據(jù)庫基本表

    mysql,用sql語句,建立學生-課程數(shù)據(jù)庫基本表

    學生表 學號 姓名 年齡 性別 院系 Student Sno Sname Sage Ssex Sdept 課程表 課程號 課程名 先行課 學分 Course Cno Cname Cpno Ccredit 選課表 學號 課程號 成績 SC Sno Cno Grade 注意創(chuàng)建表的時候要注意它的字段名,類型,長度,約束條件,取值范圍要合適,大小寫符號要正確,中文逗號,分號

    2024年02月08日
    瀏覽(27)
  • MySQL數(shù)據(jù)庫概念、管理以及SQL語句的基本命令操作

    MySQL數(shù)據(jù)庫概念、管理以及SQL語句的基本命令操作

    數(shù)據(jù)(data) 描述事物的符號記錄 包括數(shù)字,文字、圖形、圖像、聲音、檔案記錄等 以“記錄”形式按統(tǒng)一格式進行存儲(記錄可以看成一條記錄) 表 將不同的記錄組織在一起 用來存儲具體數(shù)據(jù) 記錄:行 字段(屬性):列 以行+列的形式就組成了表(數(shù)據(jù)存儲在表中) 數(shù)

    2024年02月08日
    瀏覽(33)
  • MySQL 數(shù)據(jù)庫實用指南:測試數(shù)據(jù)準備、SQL語句規(guī)范與基本操作

    MySQL 數(shù)據(jù)庫實用指南:測試數(shù)據(jù)準備、SQL語句規(guī)范與基本操作

    歡迎來到小K的MySQL專欄,本節(jié)將為大家準備MySQL測試數(shù)據(jù)、以及帶來SQL語句規(guī)范、數(shù)據(jù)庫的基本操作的詳細講解 要學習SQL查詢語句,首先必須解決一個問題,數(shù)據(jù)問題。為了方便大家學習閱讀我的文章,在這里提供了一個test.sql文件 ? 登錄MySQL,輸入 source xxx/test.sql 導入sql文

    2024年02月08日
    瀏覽(33)
  • MySQL數(shù)據(jù)庫第十一課---------SQl語句的拔高-------水平提升

    MySQL數(shù)據(jù)庫第十一課---------SQl語句的拔高-------水平提升

    ???????????????????????????????? ? ? ? ? ????? ????個人主頁 ::小小頁面 ????????????????? gitee頁面 :秦大大 ? ? ? ? ? ? ? ? 一個愛分享的小博主 ?歡迎小可愛們前來借鑒 ______________________________________________________? ? SQL提高 ? 日期函數(shù) ????

    2024年02月16日
    瀏覽(41)
  • 通過sql語句查詢出某個字段在數(shù)據(jù)庫中的某個表

    通過sql語句查詢出某個字段在數(shù)據(jù)庫中的某個表

    新入職的小伙伴,肯定還沒熟悉數(shù)據(jù)庫中表于表的關系以及表中的字段的含義是什么,就需要進行需求開發(fā),導致會出現(xiàn)對某個字段在哪張表里面都分辨不清,不過不要怕,可以利用已下sql語句快速找到。(要注意的是,此方法可能不適用于所有類型的數(shù)據(jù)庫系統(tǒng),但對于大

    2024年02月16日
    瀏覽(43)
  • MySQL數(shù)據(jù)庫增刪改查及聚合查詢SQL語句學習匯總

    MySQL數(shù)據(jù)庫增刪改查及聚合查詢SQL語句學習匯總

    目錄 數(shù)據(jù)庫增刪改查SQL語句 MySQL數(shù)據(jù)庫指令 1.查詢數(shù)據(jù)庫 2.創(chuàng)建數(shù)據(jù)庫 3.刪除數(shù)據(jù)庫 4.選擇數(shù)據(jù)庫 創(chuàng)建表table ? 查看所有表 創(chuàng)建表 查看指定表的結構 刪除表 數(shù)據(jù)庫命令進行注釋 增刪改查(CRUD)詳細說明 增加 SQL庫提供了關于時間的函數(shù):now()? 查詢 查詢表作列與列之間進

    2024年02月09日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包