索引失效場景/索引種類/全文索引用法/sql執(zhí)行順序/死鎖如何解決/什么是回表/大表如何優(yōu)化/推薦用b+樹的原因

【【【Mysql數(shù)據(jù)庫中,什么情況下設(shè)置了索引但?法使??
1. 沒有符合最左前綴原則d
2. 字段進?了隱式數(shù)據(jù)類型轉(zhuǎn)化【數(shù)據(jù)庫是varchar,但是傳參是int的不行,反之是可以的】
3. ?索引沒有全表掃描效率?

【【【索引種類有哪些
system:系統(tǒng)表中只有一條記錄,或者對于一個返回單條記錄的衍生表進行主查詢。這種類型非???,但實際開發(fā)中很少遇到。
const:當索引列是主鍵或唯一鍵,并且查詢條件完全匹配這個值時,可以到達這個級別。例如,SELECT * FROM table WHERE id = 1;,其中id是主鍵或唯一索引。
eq_ref:對于每個索引鍵的查詢,返回匹配唯一行數(shù)據(jù)。這通常發(fā)生在使用主鍵或唯一索引進行查詢時。
【普通索引】ref:非唯一性索引,對于每個索引鍵的查詢,返回匹配的所有行(可以是0,或多個)。
range:檢索指定范圍的行,查找一個范圍內(nèi)的數(shù)據(jù),例如使用BETWEEN, IN, <, >等操作符的查詢。
index:索引全表掃描,比ALL快,因為索引文件通常比數(shù)據(jù)文件小,并且索引是按順序存儲的。
ALL:全表掃描,這是最不高效的類型,因為沒有使用索引,數(shù)據(jù)庫需要掃描整個表來查找匹配的行
MySQL 索引類型有哪些?
主鍵索引
索引列中的值必須是唯一的,不允許有空值。
普通索引
MySQL中基本索引類型,沒有什么限制,允許在定義索引的列中插入重復值和空值。
唯一索引
索引列中的值必須是唯一的,但是允許為空值。
全文索引
只能在文本類型CHAR,VARCHAR,TEXT類型字段上創(chuàng)建全文索引。字段長度比較大時,如果創(chuàng)建普
通索引,在進行l(wèi)ike模糊查詢時效率比較低,這時可以創(chuàng)建全文索引。MyISAM和InnoDB中都可以
使用全文索引。
空間索引
MySQL在5.7之后的版本支持了空間索引,而且支持OpenGIS幾何數(shù)據(jù)模型。MySQL在空間索引這
方面遵循OpenGIS幾何數(shù)據(jù)模型規(guī)則。
前綴索引
在文本類型如CHAR,VARCHAR,TEXT類列上創(chuàng)建索引時,可以指定索引列的長度,但是數(shù)值類型不
能指定。
阿里內(nèi)部資料
其他(按照索引列數(shù)量分類)
1. 單列索引
2. 組合索引
組合索引的使用,需要遵循最左前綴匹配原則(最左匹配原則)。一般情況下在條件允許的情
況下使用組合索引替代多個單列索引使用。
【【【全文索引的用法
#查看長度是多少
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服務
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語句:
1. 取得鏈接,使用使用到 MySQL 中的連接器。
select name from t_user where id=1
阿里內(nèi)部資料
2. 查詢緩存,key 為 SQL 語句,value 為查詢結(jié)果,如果查到就直接返回。不建議使用次緩存,
在 MySQL 8.0 版本已經(jīng)將查詢緩存刪除,也就是說 MySQL 8.0 版本后不存在此功能。
3. 分析器,分為詞法分析和語法分析。此階段只是做一些 SQL 解析,語法校驗。所以一般語法錯
誤在此階段。
4. 優(yōu)化器,是在表里有多個索引的時候,決定使用哪個索引;或者一個語句中存在多表關(guān)聯(lián)的時
候(join),決定各個表的連接順序。
5. 執(zhí)行器,通過分析器讓 SQL 知道你要干啥,通過優(yōu)化器知道該怎么做,于是開始執(zhí)行語句。執(zhí)
行語句的時候還要判斷是否具備此權(quán)限,沒有權(quán)限就直接返回提示沒有權(quán)限的錯誤;有權(quán)限則
打開表,根據(jù)表的引擎定義,去使用這個引擎提供的接口,獲取這個表的第一行,判斷 id 是都
等于 1。如果是,直接返回;如果不是繼續(xù)調(diào)用引擎接口去下一行,重復相同的判斷,直到取
到這個表的最后一行,最后返回。

【【【oracle查詢鎖定的表和對應會話:
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查找死鎖和主動殺死方法
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
kill trx_mysql_thread_id;

【【【回表可以舉個sql例子嘛
當然可以。以MySQL數(shù)據(jù)庫為例,假設(shè)我們有一個名為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;
在這個表中,id是主鍵,而department是一個普通索引。
不需要回表的情況:
如果我們的查詢只涉及department字段,并且這個字段被索引覆蓋,那么就不需要回表:
sql
SELECT department FROM employees WHERE department = 'Sales';
在這個查詢中,MySQL可以直接使用idx_department索引來獲取所有在銷售部門的記錄,不需要訪問主鍵索引。
需要回表的情況:
如果查詢涉及到不在索引中的字段,比如salary,那么就需要回表:
sql
SELECT firstName, salary FROM employees WHERE department = 'Sales';
在這個查詢中,MySQL首先會使用idx_department索引來找到所有在銷售部門的記錄的id,然后它需要使用這些id去主鍵索引中查找每一行的firstName和salary字段,因為這些字段不在idx_department索引中。這個過程就是回表。
避免回表的優(yōu)化:
為了優(yōu)化查詢性能并避免回表,我們可以創(chuàng)建一個覆蓋索引,這個索引包含查詢中需要的所有字段:
sql
CREATE INDEX idx_department_salary ON employees (department, salary);
現(xiàn)在,如果我們使用新的索引進行查詢:
sql
SELECT department, salary FROM employees WHERE department = 'Sales';
MySQL可以直接使用idx_department_salary索引來獲取所需的數(shù)據(jù),而不需要回表,因為索引中已經(jīng)包含了department和salary字段。這就是所謂的覆蓋索引,它覆蓋了查詢所需的全部數(shù)據(jù),從而提高了查詢效率。
【【【大表如何優(yōu)化?
當MySQL單表記錄數(shù)過大時,數(shù)據(jù)庫的CRUD性能會明顯下降,一些常見的優(yōu)化措施如下:
1. 限定數(shù)據(jù)的范圍
務必禁止不帶任何限制數(shù)據(jù)范圍條件的查詢語句。比如:我們當用戶在查詢訂單歷史的時候,我們
可以控制在一個月的范圍內(nèi);
2. 讀/寫分離
經(jīng)典的數(shù)據(jù)庫拆分方案,主庫負責寫,從庫負責讀;
3. 垂直分區(qū)
根據(jù)數(shù)據(jù)庫里面數(shù)據(jù)表的相關(guān)性進行拆分。 例如,用戶表中既有用戶的登錄信息又有用戶的基本信
息,可以將用戶表拆分成兩個單獨的表,甚至放到單獨的庫做分庫。
簡單來說垂直拆分是指數(shù)據(jù)表列的拆分,把一張列比較多的表拆分為多張表。 如下圖所示,這樣來
說大家應該就更容易理解了。
1583307481617
垂直拆分的優(yōu)點: 可以使得列數(shù)據(jù)變小,在查詢時減少讀取的Block數(shù),減少I/O次數(shù)。此外,
垂直分區(qū)可以簡化表的結(jié)構(gòu),易于維護。
垂直拆分的缺點: 主鍵會出現(xiàn)冗余,需要管理冗余列,并會引起Join操作,可以通過在應用層
進行Join來解決。此外,垂直分區(qū)會讓事務變得更加復雜;
B樹和B+樹的區(qū)別,為什么Mysql使?B+樹
B樹的特點:
1. 節(jié)點排序
2. ?個節(jié)點了可以存多個元素,多個元素也排序了
B+樹的特點:
1. 擁有B樹的特點
2. 葉?節(jié)點之間有指針
3. ?葉?節(jié)點上的元素在葉?節(jié)點上都冗余了,也就是葉?節(jié)點中存儲了所有的元素,并且排好順序
Mysql索引使?的是B+樹,因為索引是?來加快查詢的,?B+樹通過對數(shù)據(jù)進?排序所以是可以提?查詢
速度的,然后通過?個節(jié)點中可以存儲多個元素,從?可以使得B+樹的?度不會太?,在Mysql中?個
Innodb?就是?個B+樹節(jié)點,?個Innodb?默認16kb,所以?般情況下?顆兩層的B+樹可以存2000萬
?左右的數(shù)據(jù),然后通過利?B+樹葉?節(jié)點存儲了所有數(shù)據(jù)并且進?了排序,并且葉?節(jié)點之間有指針,
可以很好的?持全表掃描,范圍查找等SQL語句。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容