【【【Mysql數(shù)據(jù)庫(kù)中椒惨,什么情況下設(shè)置了索引但?法使??
1. 沒有符合最左前綴原則d
2. 字段進(jìn)?了隱式數(shù)據(jù)類型轉(zhuǎn)化【數(shù)據(jù)庫(kù)是varchar阅束,但是傳參是int的不行奖地,反之是可以的】
3. ?索引沒有全表掃描效率?
【【【索引種類有哪些
system:系統(tǒng)表中只有一條記錄奈附,或者對(duì)于一個(gè)返回單條記錄的衍生表進(jìn)行主查詢。這種類型非惩W玻快滋将,但實(shí)際開發(fā)中很少遇到。
const:當(dāng)索引列是主鍵或唯一鍵撞蚕,并且查詢條件完全匹配這個(gè)值時(shí),可以到達(dá)這個(gè)級(jí)別邮破。例如诈豌,SELECT * FROM table WHERE id = 1;,其中id是主鍵或唯一索引抒和。
eq_ref:對(duì)于每個(gè)索引鍵的查詢,返回匹配唯一行數(shù)據(jù)彤蔽。這通常發(fā)生在使用主鍵或唯一索引進(jìn)行查詢時(shí)摧莽。
【普通索引】ref:非唯一性索引,對(duì)于每個(gè)索引鍵的查詢顿痪,返回匹配的所有行(可以是0镊辕,或多個(gè))。
range:檢索指定范圍的行蚁袭,查找一個(gè)范圍內(nèi)的數(shù)據(jù)征懈,例如使用BETWEEN, IN, <, >等操作符的查詢。
index:索引全表掃描揩悄,比ALL快卖哎,因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小,并且索引是按順序存儲(chǔ)的删性。
ALL:全表掃描亏娜,這是最不高效的類型,因?yàn)闆]有使用索引蹬挺,數(shù)據(jù)庫(kù)需要掃描整個(gè)表來(lái)查找匹配的行
MySQL 索引類型有哪些维贺?
主鍵索引
索引列中的值必須是唯一的,不允許有空值巴帮。
普通索引
MySQL中基本索引類型溯泣,沒有什么限制,允許在定義索引的列中插入重復(fù)值和空值榕茧。
唯一索引
索引列中的值必須是唯一的垃沦,但是允許為空值。
全文索引
只能在文本類型CHAR,VARCHAR,TEXT類型字段上創(chuàng)建全文索引雪猪。字段長(zhǎng)度比較大時(shí)栏尚,如果創(chuàng)建普
通索引,在進(jìn)行l(wèi)ike模糊查詢時(shí)效率比較低,這時(shí)可以創(chuàng)建全文索引译仗。MyISAM和InnoDB中都可以
使用全文索引抬虽。
空間索引
MySQL在5.7之后的版本支持了空間索引,而且支持OpenGIS幾何數(shù)據(jù)模型纵菌。MySQL在空間索引這
方面遵循OpenGIS幾何數(shù)據(jù)模型規(guī)則阐污。
前綴索引
在文本類型如CHAR,VARCHAR,TEXT類列上創(chuàng)建索引時(shí),可以指定索引列的長(zhǎng)度咱圆,但是數(shù)值類型不
能指定笛辟。
阿里內(nèi)部資料
其他(按照索引列數(shù)量分類)
1. 單列索引
2. 組合索引
組合索引的使用,需要遵循最左前綴匹配原則(最左匹配原則)序苏。一般情況下在條件允許的情
況下使用組合索引替代多個(gè)單列索引使用手幢。
【【【全文索引的用法
#查看長(zhǎng)度是多少
SHOW VARIABLES LIKE 'ft_min_word_len';
SHOW VARIABLES LIKE 'innodb_ft_min_token_size';
#1-編輯配置文件
vim /etc/my.cnf
#添加以下內(nèi)容
[mysqld]
ft_min_word_len = 1
innodb_ft_min_token_size = 1
#2-并且重啟mysql服務(wù)
sudo systemctl restart mysqld
#3-刪除之前創(chuàng)建的全文索引字段并且重新創(chuàng)建
#4-查詢寫法
SELECT * FROM user WHERE MATCH(name) AGAINST(concat('+', 'c', '*') IN BOOLEAN MODE);
說說在 MySQL 中一條查詢 SQL 是如何執(zhí)行的?
比如下面這條SQL語(yǔ)句:
1. 取得鏈接忱详,使用使用到 MySQL 中的連接器围来。
select name from t_user where id=1
阿里內(nèi)部資料
2. 查詢緩存,key 為 SQL 語(yǔ)句匈睁,value 為查詢結(jié)果监透,如果查到就直接返回。不建議使用次緩存航唆,
在 MySQL 8.0 版本已經(jīng)將查詢緩存刪除胀蛮,也就是說 MySQL 8.0 版本后不存在此功能。
3. 分析器糯钙,分為詞法分析和語(yǔ)法分析粪狼。此階段只是做一些 SQL 解析,語(yǔ)法校驗(yàn)超营。所以一般語(yǔ)法錯(cuò)
誤在此階段鸳玩。
4. 優(yōu)化器,是在表里有多個(gè)索引的時(shí)候演闭,決定使用哪個(gè)索引不跟;或者一個(gè)語(yǔ)句中存在多表關(guān)聯(lián)的時(shí)
候(join),決定各個(gè)表的連接順序米碰。
5. 執(zhí)行器窝革,通過分析器讓 SQL 知道你要干啥,通過優(yōu)化器知道該怎么做吕座,于是開始執(zhí)行語(yǔ)句虐译。執(zhí)
行語(yǔ)句的時(shí)候還要判斷是否具備此權(quán)限,沒有權(quán)限就直接返回提示沒有權(quán)限的錯(cuò)誤吴趴;有權(quán)限則
打開表漆诽,根據(jù)表的引擎定義,去使用這個(gè)引擎提供的接口,獲取這個(gè)表的第一行厢拭,判斷 id 是都
等于 1兰英。如果是,直接返回供鸠;如果不是繼續(xù)調(diào)用引擎接口去下一行畦贸,重復(fù)相同的判斷,直到取
到這個(gè)表的最后一行楞捂,最后返回薄坏。
【【【oracle查詢鎖定的表和對(duì)應(yīng)會(huì)話:
SELECT
o.object_name,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM
v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid
LEFT JOIN v$process p ON p.addr = s.paddr;
ALTER SYSTEM KILL SESSION 'sid,serial#';
【【【mysql查找死鎖和主動(dòng)殺死方法
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
kill trx_mysql_thread_id;
【【【回表可以舉個(gè)sql例子嘛
當(dāng)然可以。以MySQL數(shù)據(jù)庫(kù)為例寨闹,假設(shè)我們有一個(gè)名為employees的表胶坠,其中包含以下列:
sql
CREATE TABLE employees (
id INT NOT NULL AUTO_INCREMENT,
firstName VARCHAR(50),
lastName VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10, 2),
PRIMARY KEY (id),
KEY idx_department (department)
) ENGINE=InnoDB;
在這個(gè)表中,id是主鍵鼻忠,而department是一個(gè)普通索引涵但。
不需要回表的情況:
如果我們的查詢只涉及department字段,并且這個(gè)字段被索引覆蓋帖蔓,那么就不需要回表:
sql
SELECT department FROM employees WHERE department = 'Sales';
在這個(gè)查詢中,MySQL可以直接使用idx_department索引來(lái)獲取所有在銷售部門的記錄瞳脓,不需要訪問主鍵索引塑娇。
需要回表的情況:
如果查詢涉及到不在索引中的字段,比如salary劫侧,那么就需要回表:
sql
SELECT firstName, salary FROM employees WHERE department = 'Sales';
在這個(gè)查詢中埋酬,MySQL首先會(huì)使用idx_department索引來(lái)找到所有在銷售部門的記錄的id,然后它需要使用這些id去主鍵索引中查找每一行的firstName和salary字段烧栋,因?yàn)檫@些字段不在idx_department索引中写妥。這個(gè)過程就是回表。
避免回表的優(yōu)化:
為了優(yōu)化查詢性能并避免回表审姓,我們可以創(chuàng)建一個(gè)覆蓋索引珍特,這個(gè)索引包含查詢中需要的所有字段:
sql
CREATE INDEX idx_department_salary ON employees (department, salary);
現(xiàn)在,如果我們使用新的索引進(jìn)行查詢:
sql
SELECT department, salary FROM employees WHERE department = 'Sales';
MySQL可以直接使用idx_department_salary索引來(lái)獲取所需的數(shù)據(jù)魔吐,而不需要回表扎筒,因?yàn)樗饕幸呀?jīng)包含了department和salary字段。這就是所謂的覆蓋索引酬姆,它覆蓋了查詢所需的全部數(shù)據(jù)嗜桌,從而提高了查詢效率。
【【【大表如何優(yōu)化辞色?
當(dāng)MySQL單表記錄數(shù)過大時(shí)骨宠,數(shù)據(jù)庫(kù)的CRUD性能會(huì)明顯下降,一些常見的優(yōu)化措施如下:
1. 限定數(shù)據(jù)的范圍
務(wù)必禁止不帶任何限制數(shù)據(jù)范圍條件的查詢語(yǔ)句。比如:我們當(dāng)用戶在查詢訂單歷史的時(shí)候层亿,我們
可以控制在一個(gè)月的范圍內(nèi)桦卒;
2. 讀/寫分離
經(jīng)典的數(shù)據(jù)庫(kù)拆分方案,主庫(kù)負(fù)責(zé)寫棕所,從庫(kù)負(fù)責(zé)讀闸盔;
3. 垂直分區(qū)
根據(jù)數(shù)據(jù)庫(kù)里面數(shù)據(jù)表的相關(guān)性進(jìn)行拆分。 例如琳省,用戶表中既有用戶的登錄信息又有用戶的基本信
息迎吵,可以將用戶表拆分成兩個(gè)單獨(dú)的表,甚至放到單獨(dú)的庫(kù)做分庫(kù)针贬。
簡(jiǎn)單來(lái)說垂直拆分是指數(shù)據(jù)表列的拆分击费,把一張列比較多的表拆分為多張表。 如下圖所示桦他,這樣來(lái)
說大家應(yīng)該就更容易理解了蔫巩。
1583307481617
垂直拆分的優(yōu)點(diǎn): 可以使得列數(shù)據(jù)變小,在查詢時(shí)減少讀取的Block數(shù)快压,減少I/O次數(shù)圆仔。此外,
垂直分區(qū)可以簡(jiǎn)化表的結(jié)構(gòu)蔫劣,易于維護(hù)坪郭。
垂直拆分的缺點(diǎn): 主鍵會(huì)出現(xiàn)冗余,需要管理冗余列脉幢,并會(huì)引起Join操作歪沃,可以通過在應(yīng)用層
進(jìn)行Join來(lái)解決。此外嫌松,垂直分區(qū)會(huì)讓事務(wù)變得更加復(fù)雜沪曙;
B樹和B+樹的區(qū)別,為什么Mysql使?B+樹
B樹的特點(diǎn):
1. 節(jié)點(diǎn)排序
2. ?個(gè)節(jié)點(diǎn)了可以存多個(gè)元素萎羔,多個(gè)元素也排序了
B+樹的特點(diǎn):
1. 擁有B樹的特點(diǎn)
2. 葉?節(jié)點(diǎn)之間有指針
3. ?葉?節(jié)點(diǎn)上的元素在葉?節(jié)點(diǎn)上都冗余了液走,也就是葉?節(jié)點(diǎn)中存儲(chǔ)了所有的元素,并且排好順序
Mysql索引使?的是B+樹外驱,因?yàn)樗饕?來(lái)加快查詢的育灸,?B+樹通過對(duì)數(shù)據(jù)進(jìn)?排序所以是可以提?查詢
速度的,然后通過?個(gè)節(jié)點(diǎn)中可以存儲(chǔ)多個(gè)元素昵宇,從?可以使得B+樹的?度不會(huì)太?磅崭,在Mysql中?個(gè)
Innodb?就是?個(gè)B+樹節(jié)點(diǎn),?個(gè)Innodb?默認(rèn)16kb瓦哎,所以?般情況下?顆兩層的B+樹可以存2000萬(wàn)
?左右的數(shù)據(jù)砸喻,然后通過利?B+樹葉?節(jié)點(diǎn)存儲(chǔ)了所有數(shù)據(jù)并且進(jìn)?了排序柔逼,并且葉?節(jié)點(diǎn)之間有指針,
可以很好的?持全表掃描割岛,范圍查找等SQL語(yǔ)句愉适。