檢測(cè)到您已登錄華為云國(guó)際站賬號(hào),為了您更好的體驗(yàn),建議您訪(fǎng)問(wèn)國(guó)際站服務(wù)網(wǎng)站 http://m.cqfng.cn/intl/zh-cn
不再顯示此消息
MySQL目前已經(jīng)作為絕大數(shù)項(xiàng)目的數(shù)據(jù)庫(kù)選擇。但是經(jīng)常會(huì)需要去處理慢sql導(dǎo)致的各類(lèi)問(wèn)題。索引,作為一種常見(jiàn)的處理方式。我們有必要了解下索引的底層是怎么實(shí)現(xiàn)的。思考兩個(gè)問(wèn)題:1.為什么加了索引以后,數(shù)據(jù)庫(kù)的查詢(xún)效率會(huì)加快?底層怎么實(shí)現(xiàn)的?2.索引失效的情況有哪些?失效的原因是什么
優(yōu)化。索引選擇性與前綴索引既然索引可以加快查詢(xún)速度,那么是不是只要是查詢(xún)語(yǔ)句需要,就建上索引?答案是否定的。因?yàn)?span id="ck8u8gw" class='cur'>索引雖然加快了查詢(xún)速度,但索引也是有代價(jià)的:索引文件本身要消耗存儲(chǔ)空間,同時(shí)索引會(huì)加重插入、刪除和修改記錄時(shí)的負(fù)擔(dān),另外,MySQL在運(yùn)行時(shí)也要消耗資源維護(hù)索引,因此索
關(guān)鍵字后的選擇列表中的列。4. 限制索引的數(shù)目索引的數(shù)目不是“越多越好”。每個(gè)索引都需要占用磁盤(pán)空間,索引越多,需要的磁盤(pán)空間就越大。在修改表的內(nèi)容時(shí),索引必須進(jìn)行更新,有時(shí)還可能需要重構(gòu)。因此,索引越多,更新表的時(shí)間就越長(zhǎng)。如果有一個(gè)索引很少利用或從不使用,那么會(huì)不必要地減緩表的修改速度。此外,MySQL
就可能會(huì)出現(xiàn)性能問(wèn)題。possible_keys:sql所用到的索引key:顯示MySQL實(shí)際決定使用的鍵(索引)。如果沒(méi)有選擇索引,鍵是NULL(1)全值匹配全值匹配指的是和索引中的所有列進(jìn)行匹配。例如上面的People表的索引(last_name,first_name,dob
by、order by)中,建議一開(kāi)始就不要創(chuàng)建索引或?qū)?span id="o2mrxkw" class='cur'>索引刪除,因?yàn)?span id="xfpu4er" class='cur'>索引的存在也會(huì)占用空間。2、數(shù)據(jù)量小的表最好不要使用索引3、有大量重復(fù)數(shù)據(jù)的列上不要建立索引在條件表達(dá)式中經(jīng)常用到的不同值較多的列上建立索引,但字段中如果有大量重復(fù)數(shù)據(jù),也不用創(chuàng)建索引。比如學(xué)生表中的性別字段,只有男和女兩種值
臨時(shí)數(shù)據(jù),例如復(fù)雜查詢(xún)的中間結(jié)果或臨時(shí)數(shù)據(jù)集,而普通表通常用于存儲(chǔ)持久性數(shù)據(jù)。創(chuàng)建與使用臨時(shí)表在MySQL中,可以使用CREATE TEMPORARY TABLE語(yǔ)句來(lái)創(chuàng)建臨時(shí)表。創(chuàng)建臨時(shí)表的語(yǔ)法與普通表的語(yǔ)法類(lèi)似,但需要在表名后添加TEMPORARY關(guān)鍵字。下面是創(chuàng)建臨時(shí)表的基本語(yǔ)法示例:CREATE
詢(xún)效率。臨時(shí)表主要適用于需要臨時(shí)保存數(shù)據(jù)的一些場(chǎng)景。一般情況下,臨時(shí)表通常是在應(yīng)用程序中動(dòng)態(tài)創(chuàng)建或者由 MySQL 內(nèi)部根據(jù)需要自己創(chuàng)建。臨時(shí)表可以分為內(nèi)部臨時(shí)表和外部臨時(shí)表。外部臨時(shí)表外部臨時(shí)表也可稱(chēng)為會(huì)話(huà)臨時(shí)表,這種臨時(shí)表只對(duì)當(dāng)前用戶(hù)可見(jiàn),它的數(shù)據(jù)和表結(jié)構(gòu)都存儲(chǔ)在內(nèi)存中。當(dāng)前
MySql索引索引優(yōu)點(diǎn) 1.可以通過(guò)建立唯一索引或者主鍵索引,保證數(shù)據(jù)的唯一性. 2.提高檢索的數(shù)據(jù)性能 3.在表連接的連接條件 可以加速表與表直接的相連 4.建立索引,在查詢(xún)中使用索引 可以提高性能索引缺點(diǎn)
例如對(duì)于只有100條數(shù)據(jù)的MySQL表是否有必要加索引,這取決于具體的使用場(chǎng)景。以下是一些考慮因素:查詢(xún)頻率:如果該字段是查詢(xún)條件中經(jīng)常使用的,且查詢(xún)頻率較高,那么加索引可以提高查詢(xún)效率。數(shù)據(jù)唯一性:如果該字段的值具有較高唯一性,即不同值的數(shù)量接近于表中記錄的數(shù)量,那么索引的選擇性會(huì)很高,加索引會(huì)更
時(shí),當(dāng)where是輔助索引時(shí),必須增加一次回表的數(shù)據(jù)訪(fǎng)問(wèn),同時(shí)也增加了IO訪(fǎng)問(wèn)次數(shù)。滿(mǎn)足覆蓋索引的索引類(lèi)型Mysql中只有B+Tree所有支持覆蓋索引。哈希索引、空間索引、全文索引都不存儲(chǔ)索引列的值,也就不支持覆蓋索引。4)索引條件下推應(yīng)用條件:只適用于二級(jí)索引(輔助索引)。索引的過(guò)濾是在存儲(chǔ)引擎層進(jìn)行的,數(shù)據(jù)
索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)類(lèi)似與一本書(shū)的目錄。MySQL索引的建立對(duì)于MySQL的高效運(yùn)行是很重要的,索引可以大大提高MySQL的檢索速度。索引只是提高效率的一個(gè)因素,如果你的MySQL有大數(shù)據(jù)量的表,就需要花時(shí)間研究建立最優(yōu)秀的索引,或優(yōu)化查詢(xún)
引。 普通索引:即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引 唯一索引:索引列的值必須唯一,但允許有空值 復(fù)合索引:多列值組成一個(gè)索引,專(zhuān)門(mén)用于組合搜索,其效率大于索引合并 聚簇索引(聚集索引):并不是一種單獨(dú)的索引類(lèi)型,而是一種數(shù)據(jù)存儲(chǔ)方式。具體細(xì)節(jié)取決于不同的實(shí)現(xiàn),Inn
Mysql索引主要有兩種結(jié)構(gòu):B+Tree索引和Hash索引. Hash索引 MySQL中,只有Memory(Memory表只存在內(nèi)存中,斷電會(huì)消失,適用于臨時(shí)表)存儲(chǔ)引擎顯示支持Hash索引,是Memory表的默認(rèn)索引類(lèi)型,盡管Memory表也可以使用B+Tree索引。hsah索引把數(shù)據(jù)的索引以hash形式組織起來(lái),因此當(dāng)查找某一條記錄的時(shí)候
索引是滿(mǎn)足某種特定查找算法的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)會(huì)以某種方式指向數(shù)據(jù),從而實(shí)現(xiàn)高效查找數(shù)據(jù)。具體來(lái)說(shuō) MySQL 中的索引,不同的數(shù)據(jù)引擎實(shí)現(xiàn)有所不同,但目前主流的數(shù)據(jù)庫(kù)引擎的索引都是 B+ 樹(shù)實(shí)現(xiàn)的,B+ 樹(shù)的搜索效率,可以到達(dá)二分法的性能,找到數(shù)據(jù)區(qū)域之后就找到了完整的數(shù)據(jù)結(jié)構(gòu)了,所有索引的性能也是更好的。
key)時(shí),會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)列的索引。 查看索引: show index from 表名; 創(chuàng)建索引表: 對(duì)于非主鍵、非唯一約束、非外鍵的字段,可以創(chuàng)建普通索引!!! create index 索引名 on 表名(字段名); 案例:創(chuàng)建班級(jí)表中,name字段的索引! 可以看到
update優(yōu)化(避免行鎖升級(jí)為表鎖) InnoDB 的行鎖是針對(duì)索引加的鎖,不是針對(duì)記錄加的鎖,并且該索引不能失效,否則會(huì)從行鎖升級(jí)為表鎖。 如以下兩條語(yǔ)句: update student set no = '123' where id = 1;,這句由于id有主鍵索引,所以只會(huì)鎖這一行;
如果一個(gè)索引包含(或覆蓋)所有需要查詢(xún)的字段的值,稱(chēng)為‘覆蓋索引’.什么是覆蓋索引創(chuàng)建一個(gè)索引,該索引包含查詢(xún)中用到的所有字段,稱(chēng)為“覆蓋索引”。使用覆蓋索引,MySQL 只需要通過(guò)索引就可以查找和返回查詢(xún)所需要的數(shù)據(jù),而不必在使用索引處理數(shù)據(jù)之后再進(jìn)行回表操作。覆蓋索引可以一次
的基本概念在MySQL中,索引是幫助數(shù)據(jù)庫(kù)管理系統(tǒng)高效查詢(xún)、更新和管理表中數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu)。索引可以類(lèi)比為書(shū)籍的目錄,通過(guò)索引可以快速找到所需的數(shù)據(jù),而不需要掃描整個(gè)表。索引的內(nèi)部結(jié)構(gòu)MySQL支持多種類(lèi)型的索引,包括B-Tree索引、Hash索引、R-Tree索引等。其中,B
MySQL選錯(cuò)索引的原因主要包括以下幾點(diǎn):統(tǒng)計(jì)信息不準(zhǔn)確:MySQL的優(yōu)化器在選擇索引時(shí),會(huì)根據(jù)統(tǒng)計(jì)信息來(lái)估算掃描的行數(shù)。如果統(tǒng)計(jì)信息不準(zhǔn)確,優(yōu)化器可能會(huì)選擇錯(cuò)誤的索引。例如,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),索引的基數(shù)(cardinality)可能沒(méi)有及時(shí)更新,導(dǎo)致優(yōu)化器對(duì)掃描行數(shù)的預(yù)估出現(xiàn)偏
普通索引和前綴索引 DWS不支持前綴索引,也不支持內(nèi)聯(lián)普通索引。DSC工具遷移時(shí)會(huì)根據(jù)DWS的特性將其遷移為普通索引。 內(nèi)聯(lián)普通(前綴)索引。 輸入示例 1 2 3 4 5 6 CREATE TABLE IF NOT EXISTS `public`.`runoob_dataType_test`