數(shù)據(jù)庫索引有關(guān)的知識,說實在的,真的是很復(fù)雜,本來想好好看看這方面的東西,然后寫篇文章詳細(xì)談?wù)劦?,后來發(fā)現(xiàn)索引的知識太難太深,要談得全面又詳細(xì)真的很難,所以最后還是把自己學(xué)到的和想到的變成下面一個個的問題,希望能對大家?guī)椭?/p> 知識點問題1:什么是數(shù)據(jù)庫索引?數(shù)據(jù)庫索引是數(shù)據(jù)庫系統(tǒng)中一個重要的概念,索引也叫做 總而言之,索引就像給數(shù)據(jù)表建了一個目錄一樣。 問題2:為什么在使用索引?1 . 使用索引大大減少了存儲引擎需要掃描的數(shù)據(jù)量,如果沒有使用索引的話,每查詢一行數(shù)據(jù)都要對數(shù)據(jù)表進(jìn)行掃描,這樣的話會非常慢。 2 . 由于索引已經(jīng)排好序的,所以對數(shù)據(jù)表進(jìn)行 3 . 索引可以將隨機(jī)的 問題3:MySQL索引在哪個模塊中實現(xiàn)的?
問題4:為什么設(shè)置了索引卻不起作用?如果使用以 SELECT * FROM users WHERE name LIKE '%小張%'; SELECT * FROM users WHERE name LIKE '%小張'; 復(fù)制代碼
不過以 SELECT * FROM users WHERE name LIKE '張%';
復(fù)制代碼
SELECT * FROM users id = 10 or name='test'
復(fù)制代碼
問題5:MySQL索引底層使用什么數(shù)據(jù)結(jié)構(gòu)?在 另外也有一些特殊的索引結(jié)構(gòu),比如哈希索引,哈希索引底層則使用的是哈希表,在 問題6:什么情況下數(shù)據(jù)表不適合創(chuàng)建索引?1 . 對于用于存儲歸檔歷史數(shù)據(jù)的且很少用于查詢的數(shù)據(jù)表,不建議創(chuàng)建索引。 2 . 數(shù)據(jù)量比較小的數(shù)據(jù)表,而且未來數(shù)據(jù)也不會有太大增長的數(shù)據(jù),不應(yīng)該建索引,比如用于保存配置的數(shù)據(jù)表。 3 . 修改頻繁,且修改性能遠(yuǎn)大于查詢性能時,不應(yīng)該再創(chuàng)建索引。 問題7:什么是回表?回表是對Innodb存儲引擎而言的,在 當(dāng)我們通過主鍵查詢時,只需要搜索主鍵索引的搜索樹,直接可以得到記錄的數(shù)據(jù)。 當(dāng)我們通過普通索引進(jìn)行查詢時,通過搜索普通索引的搜索樹得到主鍵的地址之后,還要再使用該主鍵對主鍵搜索樹進(jìn)行搜索,這個過程稱為回表。 問題8:聚簇索引與非聚簇索引的區(qū)別?聚簇索引:聚簇索引的順序就是數(shù)據(jù)的物理存儲順序,并且索引與數(shù)據(jù)放在一塊,通過索引可以直接獲取數(shù)據(jù),一個數(shù)據(jù)表中僅有一個聚簇索引。 非聚簇索引:索引順序與數(shù)據(jù)物理排列順序無關(guān),索引文件與數(shù)據(jù)是分開存放。 問題9:MySQL主鍵索引、唯一索引與普通索引的區(qū)別?設(shè)置為主鍵索引的字段不允許為 設(shè)置為唯一索引的字段,其字段值不允許重要。 普通索引可以包含重復(fù)的值,也可以為 問題10:索引可以提高查詢性能,那是不是索引創(chuàng)建越多越好?索引作為一個數(shù)據(jù)表的目錄,本身的存儲就需要消耗很多的磁盤和內(nèi)存存儲空間。 并助在寫入數(shù)據(jù)表數(shù)據(jù)時,每次都需要更新索引,所以索引越多,寫入就越慢。 尤其是糟糕的索引,建得越多對數(shù)據(jù)庫的性能影響越大。 問題11:MyISAM與InnoDB在處理索引上有什么不同?
而 問題12:什么是索引的最左前綴原則?
CREATE TABLE test(
a INT NOT NOT,
b INT NOT NOT,
KEY(a,b)
);
復(fù)制代碼
當(dāng)我們使用下面的查詢語句時,由于 SELECT * FROM test WHERE a=1 AND b=1;
復(fù)制代碼
同樣,下面的語句也會利用上面創(chuàng)建的聯(lián)合索引,這是因為 SELECT * FROM test WHERE a=1;
復(fù)制代碼
而使用 SELECT * FROM test WHERE b=1;
復(fù)制代碼
從上面例子可以很好地了解索引的最左前綴原則,同時也說明了索引順序的重要性。 問題13:什么是覆蓋索引?如果一個索引中包含查詢所要的字段時,此時不需要再回表查詢,我們就稱該索引為覆蓋索引。 比如下面的查詢中,字段id是主鍵索引,所以可以直接返回索引的值,顯著提升了查詢的性能。 SELECT id FROM users WHERE id BETWEEN 10 AND 20;
復(fù)制代碼
小結(jié)當(dāng)然,上面列出的只是索引的一小部分知識點,有什么回答不對的地方,歡迎指出。
|
|