日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

索引原理及几种索引类型区别

發(fā)布時(shí)間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 索引原理及几种索引类型区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在關(guān)系數(shù)據(jù)庫中,索引是一種單獨(dú)的、物理的對數(shù)據(jù)庫表中的一列或多列的值進(jìn)行排序的一種存儲結(jié)構(gòu), 它是某個(gè)表中一列或若干列值的集合和相應(yīng)的指向表中物理標(biāo)識這些值的數(shù)據(jù)頁的邏輯指針清單。索引的作用相當(dāng)于圖書的目錄,可以根據(jù)目錄中的頁碼快速找到所需的內(nèi)容。 索引提供只想存儲在表的指定列中的數(shù)據(jù)值的指針,然后根據(jù)指定的排序順序?qū)@些指針排序,數(shù)據(jù)庫使用索引以找到特定值,然后根據(jù)指針找到包含該值的行,這樣可以使對應(yīng)于表的sql語句執(zhí)行的更快,可快速訪問數(shù)據(jù)表中的特定信息。 索引的原理 先提出幾個(gè)問題:
  • 為什么要給表加上主鍵?
  • 為什么加索引后會使查詢變快?
  • 為什么加索引后會使寫入、修改、刪除變慢?
  • 什么情況下要同時(shí)在兩個(gè)字段上建索引?
接下里一一解決: 我們平時(shí)建表的時(shí)候都會為表加上主鍵, 在某些關(guān)系數(shù)據(jù)庫中, 如果建表時(shí)不指定主鍵,數(shù)據(jù)庫會拒絕建表的語句執(zhí)行。 事實(shí)上, 一個(gè)加了主鍵的表,并不能被稱之為「表」。一個(gè)沒加主鍵的表,它的數(shù)據(jù)無序的放置在磁盤存儲器上,一行一行的排列的很整齊, 跟我認(rèn)知中的「表」很接近。如果給表上了主鍵,那么表在磁盤上的存儲結(jié)構(gòu)就由整齊排列的結(jié)構(gòu)轉(zhuǎn)變成了樹狀結(jié)構(gòu),也就是上面說的「平衡樹」結(jié)構(gòu),換句話說,就是整個(gè)表就變成了一個(gè)索引。沒錯(cuò), 再說一遍, 整個(gè)表變成了一個(gè)索引,也就是所謂的「聚集索引」。 這就是為什么一個(gè)表只能有一個(gè)主鍵, 一個(gè)表只能有一個(gè)「聚集索引」,因?yàn)橹麈I的作用就是把「表」的數(shù)據(jù)格式轉(zhuǎn)換成「索引(平衡樹)」的格式放置。 主鍵一定是唯一性索引 假如一張表有一億條數(shù)據(jù) ,需要查找其中某一條數(shù)據(jù),按照常規(guī)邏輯, 一條一條的去匹配的話, 最壞的情況下需要匹配一億次才能得到結(jié)果,用大O標(biāo)記法就是O(n)最壞時(shí)間復(fù)雜度,這是無法接受的, 而且這一億條數(shù)據(jù)顯然不能一次性讀入內(nèi)存供程序使用, 因此, 這一億次匹配在不經(jīng)緩存優(yōu)化的情況下就是一億次IO開銷,以現(xiàn)在磁盤的IO能力和CPU的運(yùn)算能力, 有可能需要幾個(gè)月才能得出結(jié)果 。 如果把這張表轉(zhuǎn)換成平衡樹結(jié)構(gòu)(一棵非常茂盛和節(jié)點(diǎn)非常多的樹),假設(shè)這棵樹有10層,那么只需要10次IO開銷就能查找到所需要的數(shù)據(jù), 速度以指數(shù)級別提升,用大O標(biāo)記法就是O(log n),n是記錄總樹,底數(shù)是樹的分叉數(shù), 結(jié)果就是樹的層次數(shù)。換言之,查找次數(shù)是以樹的分叉數(shù)為底,記錄總數(shù)的對數(shù),用程序來表示就是Math.Log(100000000,10),100000000是記錄數(shù),10是樹的分叉數(shù)(真實(shí)環(huán)境下分叉數(shù)遠(yuǎn)不止10), 結(jié)果就是查找次數(shù), 這里的結(jié)果從億降到了個(gè)位數(shù)。因此,利用索引會使數(shù)據(jù)庫查詢有驚人的性能提升。 然而, 事物都是有兩面的, 索引能讓數(shù)據(jù)庫查詢數(shù)據(jù)的速度上升, 而使寫入數(shù)據(jù)的速度下降,原因很簡單的, 因?yàn)槠胶鈽溥@個(gè)結(jié)構(gòu)必須一直維持在一個(gè)正確的狀態(tài), 增刪改數(shù)據(jù)都會改變平衡樹各節(jié)點(diǎn)中的索引數(shù)據(jù)內(nèi)容,破壞樹結(jié)構(gòu),? 因此,在每次數(shù)據(jù)改變時(shí), DBMS必須去重新梳理樹(索引)的結(jié)構(gòu)以確保它的正確,這會帶來不小的性能開銷,也就是為什么索引會給查詢以外的操作帶來副作用的原因。 以上是聚集索引的內(nèi)容,接下來看一下非聚集索引也就是常規(guī)索引 非聚集索引跟聚集索引一樣,同樣是采用平衡樹所謂索引的數(shù)據(jù)結(jié)構(gòu), 非聚集索引和聚集索引的區(qū)別在于, 通過聚集索引可以查到需要查找的數(shù)據(jù), 而通過非聚集索引可以查到記錄對應(yīng)的主鍵值 , 再使用主鍵的值通過聚集索引查找到需要的數(shù)據(jù),如下圖: 不管通過任何方式、索引查詢表,最終都是利用主鍵通過聚集索引來定位到數(shù)據(jù)。

MySQL索引類型

?

一、簡介

?

MySQL目前主要有以下幾種索引類型: 1.普通索引 2.唯一索引 3.主鍵索引 4.組合索引 5.全文索引

二、語句

CREATE TABLE table_name[col_name data type][unique|fulltext][index|key][index_name](col_name[length])[asc|desc]

?

1.unique|fulltext為可選參數(shù),分別表示唯一索引、全文索引 2.index和key為同義詞,兩者作用相同,用來指定創(chuàng)建索引 3.col_name為需要?jiǎng)?chuàng)建索引的字段列,該列必須從數(shù)據(jù)表中該定義的多個(gè)列中選擇 4.index_name指定索引的名稱,為可選參數(shù),如果不指定,默認(rèn)col_name為索引值 5.length為可選參數(shù),表示索引的長度,只有字符串類型的字段才能指定索引長度 6.asc或desc指定升序或降序的索引值存儲

三、索引類型

?

1.普通索引 是最基本的索引,它沒有任何限制。它有以下幾種創(chuàng)建方式: (1)直接創(chuàng)建索引 CREATE INDEX index_name ON table(column(length)) (2)修改表結(jié)構(gòu)的方式添加索引 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) (3)創(chuàng)建表的時(shí)候同時(shí)創(chuàng)建索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length)) ) (4)刪除索引 DROP INDEX index_name ON table

?

2.唯一索引 與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創(chuàng)建方式: (1)創(chuàng)建唯一索引 CREATE UNIQUE INDEX indexName ON table(column(length)) (2)修改表結(jié)構(gòu) ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) (3)創(chuàng)建表的時(shí)候直接指定 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , UNIQUE indexName (title(length)) );

?

3.主鍵索引 是一種特殊的唯一索引,一個(gè)表只能有一個(gè)主鍵,不允許有空值。一般是在建表的時(shí)候同時(shí)創(chuàng)建主鍵索引: CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) NOT NULL , PRIMARY KEY (`id`) );

?

4.組合索引 指多個(gè)字段上創(chuàng)建的索引,只有在查詢條件中使用了創(chuàng)建索引時(shí)的第一個(gè)字段,索引才會被使用。使用組合索引時(shí)遵循最左前綴集合 ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);

?

5.全文索引 主要用來查找文本中的關(guān)鍵字,而不是直接與索引中的值相比較。fulltext索引跟其它索引大不相同,它更像是一個(gè)搜索引擎,而不是簡單的where語句的參數(shù)匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以創(chuàng)建全文索引。值得一提的是,在數(shù)據(jù)量較大時(shí)候,現(xiàn)將數(shù)據(jù)放入一個(gè)沒有全局索引的表中,然后再用CREATE index創(chuàng)建fulltext索引,要比先為一張表建立fulltext然后再將數(shù)據(jù)寫入的速度快很多。 (1)創(chuàng)建表的適合添加全文索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (content) ); (2)修改表結(jié)構(gòu)添加全文索引 ALTER TABLE article ADD FULLTEXT index_content(content) (3)直接創(chuàng)建索引 CREATE FULLTEXT INDEX index_content ON article(content)

四、缺點(diǎn)

?

1.雖然索引大大提高了查詢速度,同時(shí)卻會降低更新表的速度,如對表進(jìn)行insert、update和delete。因?yàn)楦卤頃r(shí),不僅要保存數(shù)據(jù),還要保存一下索引文件。 2.建立索引會占用磁盤空間的索引文件。一般情況這個(gè)問題不太嚴(yán)重,但如果你在一個(gè)大表上創(chuàng)建了多種組合索引,索引文件的會增長很快。 索引只是提高效率的一個(gè)因素,如果有大數(shù)據(jù)量的表,就需要花時(shí)間研究建立最優(yōu)秀的索引,或優(yōu)化查詢語句。

五、注意事項(xiàng)

?

使用索引時(shí),有以下一些技巧和注意事項(xiàng): 1.索引不會包含有null值的列 只要列中包含有null值都將不會被包含在索引中,復(fù)合索引中只要有一列含有null值,那么這一列對于此復(fù)合索引就是無效的。所以我們在數(shù)據(jù)庫設(shè)計(jì)時(shí)不要讓字段的默認(rèn)值為null。 2.使用短索引 對串列進(jìn)行索引,如果可能應(yīng)該指定一個(gè)前綴長度。例如,如果有一個(gè)char(255)的列,如果在前10個(gè)或20個(gè)字符內(nèi),多數(shù)值是惟一的,那么就不要對整個(gè)列進(jìn)行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作。 3.索引列排序 查詢只使用一個(gè)索引,因此如果where子句中已經(jīng)使用了索引的話,那么order by中的列是不會使用索引的。因此數(shù)據(jù)庫默認(rèn)排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個(gè)列的排序,如果需要最好給這些列創(chuàng)建復(fù)合索引。 4.like語句操作 一般情況下不推薦使用like操作,如果非使用不可,如何使用也是一個(gè)問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。 5.不要在列上進(jìn)行運(yùn)算 這將導(dǎo)致索引失效而進(jìn)行全表掃描,例如 SELECT * FROM table_name WHERE YEAR(column_name)<2017; 6.不使用not in和<>操作

轉(zhuǎn)載于:https://www.cnblogs.com/little-orangeaaa/p/9707850.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的索引原理及几种索引类型区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。