mysql 索引 SQL 體系結(jié)構(gòu)

體系結(jié)構(gòu)及基礎(chǔ)管理

1.MySQL有哪些安裝方式?

二進制安裝
編譯安裝

2.MySQL 5.6 、 5.7 安裝過程有什么區(qū)別?

初始化:
5.6 : /data/app/mysql/scripts/mysql_install_db
5.7 : mysqld --initialize-insecure / --initialize

3.MySQL 5.7、 8.0 在用戶管理有什么區(qū)別,請舉例說明?

8.0 之前:

用戶管理:

1\. create user [<u>oldboy@’10.0.0.%’identified</u>](mailto:oldboy@'10.0.0.%25'identified) by ‘123’;

2\. grant all on *.* to [<u>oldboy@’10.0.0.%</u>](mailto:oldboy@'10.0.0.%25)’;

或者:

Grant all on *.* to [<u>oldguo@’10.0.0.%</u>](mailto:oldguo@'10.0.0.%25)’ identified by ‘123’;

8.0 以后:

1. 只能先建用戶后授權(quán)

2. 加密方式:從native插件方式改變?yōu)榱藄ha2加密插件。遠程客戶端、主從、MHA架構(gòu)等。

4.請介紹MySQL授權(quán)表有哪些,都有什么作用?

User        :用戶、密碼、加密插件、全庫級別的用戶權(quán)限。
Db          :單庫級別
tables_priv : 表級別
columns_priv:列級別
procs_priv  :存儲過程
proxies_priv:代理

user 用戶所有信息+*.*級別權(quán)限
db   用戶部分信息+wordpress級別權(quán)限
tables_priv 用戶的部分信息+wordpress.t1級別信息

5.簡述你在工作中MySQL 遠程連接的方式?

musql &
mysql -uroot -p
mysql -uroot -p -h 10.0.0.51 -P3306
sqyog
navicat

6.請列舉MySQL配置文件的讀取順序?

mysqld --verbose --help | grep -A 1 'Default options'

/etc/my.cnf    /etc/mysql/my.cnf    /usr/local/mysql/etc/my.cnf     ~/.my.cnf

7.請簡述MySQL配置文件結(jié)構(gòu)?列舉至少5項基礎(chǔ)配置項?

標簽項
[mysqld] [mysqld_safe] [server]
配置項
datadir=/data/3306/data
basedir=/data/app/mysql
server_id=3306
log_error=/data/3306/mysql.log
socket=/tmp/mysql.sock

8.請列舉MySQL的啟動和關(guān)閉的方式?

啟動: sys-v、systemd → support-fils/mysql.server→mysqld_safe→mysqld
關(guān)閉:sys-v、systemd → support-fils/mysql.server ,shutdown,mysqladmin shutdown

9請簡述MySQL忘記本地root密碼的處理方法和其中的原理?

1.關(guān)數(shù)據(jù)庫
2.啟動到安全模式: mysqld_safe --skip-grant-tables  --skip-networking &
3.flush privileges; 手工加載表信息
4.修改密碼:grant \ alter \set password
4.重啟數(shù)據(jù)庫

10.你們公司使用多實例環(huán)境嗎?在什么地方用的?

1.測試環(huán)境
2.分布式架構(gòu)
3.備用系統(tǒng)

11.如何查看數(shù)據(jù)庫的當前連接情況?

select * from information_schema.processlist;
show full processlist;

12.簡述數(shù)據(jù)庫啟動不了,你的排查過程?

查看錯誤日志
(1)看日志 log_error
(2)[root@db01 ~]# mysqld --defaults-file=/etc/my.cnf &

13.升級至5.7 、8.0,升級方式上有什么區(qū)別?8.0要注意什么?

區(qū)別:升級到5.7 ,需要執(zhí)行mysql_upgrade,升級到8.0,直接用高版本軟件掛低版本庫啟動。
升級到8.0以前,一定要提前備份。
升級時候建議,不要跨多版本。5.6最新版升級到5.7,5.7最新版升級到8.0
[root@db01 ~]# mysqlsh root:123@10.0.0.51:3306 -e "util.checkForServerUpgrade()"

14.mysql查詢表中數(shù)據(jù)中文字體亂碼,原因可能是什么?如何修改?

字符集問題。
一般是客戶端軟件的字符集設(shè)定和服務(wù)器端不一致。
character_set_server=utf8mb4
Set names utf8mb4;
替換字符集:邏輯導出數(shù)據(jù),庫alter,替換備份中的字符集,導入數(shù)據(jù)。

15.什么是實例?

公司 = boss+經(jīng)理+員工+辦公室
實例 = mysqld + master thread + 干活的thread + 內(nèi)存結(jié)構(gòu)

16.簡述MySQL的程序結(jié)構(gòu)?

Mysqld = server層(連接層+SQL層) + 存儲引擎層

17.簡述一條Select語句的執(zhí)行過程?

sql 首先通過連接層
1.驗證鏈接協(xié)議,協(xié)議分別是socked本地連接和TCP/IP 遠程連接,驗證通過
2.會檢查ip 用戶名 端口 密碼的合法性,再交給連接層
3.連接層不具備處理sql語句,會交給sql層來處理

sql層
1.sql層拿到連接層傳來的sql語句,進行語法,語義,權(quán)限,sql_mode驗證,驗證通過交給解析器
2.解析器對sql語句進行解析,形成多種執(zhí)行樹
3.解析完通過優(yōu)化器算法,生成代價最低的執(zhí)行計劃
4.再由執(zhí)行器,最終真正運行sql語句

存儲引擎層:
負責根據(jù)sql層的執(zhí)行結(jié)果,從磁盤上拿數(shù)據(jù);
將16進制的磁盤數(shù)據(jù),交給sql結(jié)構(gòu)化 化成表,連接層的專用線程返回給用戶

18.請簡述MySQL的邏輯結(jié)構(gòu)和宏觀物理結(jié)構(gòu)?

邏輯結(jié)構(gòu):庫,表,數(shù)據(jù)行
物理結(jié)構(gòu):
Myisam: myi myd frm
InnoDB: ibd 、frm、ibdata、ibtmp、undo、redo

19.請簡述段、區(qū)、頁的構(gòu)成?

一個表就是一個段。
一個段有多個區(qū)構(gòu)成,
一個區(qū)(16k)有連續(xù)的64個頁 1M大小

索引篇

一、列舉MySQL索引類型

Btree
Rtree
Fulltest
HASH

二mysql為什么選擇Btree索引查找算法?

btree可以快速鎖定范圍查詢,掃描次數(shù)是一樣的

三、mysql索引算法演變:btree-b+tree-B*tree的區(qū)別?

1.b-tree是btree的變體,普通的葉子節(jié)點沒有指針,想要不遍布全表查詢,只能等值查詢
2.所以增加了B+tree,B+tree的葉子節(jié)點有指針,對于范圍查找和io優(yōu)化,不會遍布全表查詢。><=
3.是B+樹的變體,在B+樹的非根和非葉子結(jié)點再增加指向兄弟的指針;

四、mysql 聚簇索引如何構(gòu)建B+tree?

葉子節(jié)點:聚簇索引組織表,按照聚簇索引順序,物理有序的存儲的是表的數(shù)據(jù)行
枝節(jié)點:保存下層葉子節(jié)點的ID范圍+指針
根節(jié)點:保存下層枝節(jié)點的id范圍和指針

五、mysql輔助索引如何構(gòu)建B+tree?

葉子節(jié)點:ID+輔助索引列排序后生成。
枝節(jié)點: 保存下層葉子節(jié)點輔助索引鍵值的范圍+指針
根節(jié)點: 保存下層枝節(jié)點輔助索引鍵值范圍+指針

六、什么是回表查詢?如何減少回表?

通過輔助索引查找到ID,回到聚簇索引查詢。

產(chǎn)生的問題:會導致IO增加

減少:
1.增加查詢條件的精確度
2.覆蓋索引。覆蓋大部分查詢條件和數(shù)據(jù)
3.優(yōu)化器算法

七、索引樹高度影響因素有哪些?

索引樹高度指的是,有幾層,最低兩層,建議4層。

影響因素:
1.數(shù)據(jù)行多,
解決:分區(qū)表,歸檔表(轉(zhuǎn)儲表)分庫分表
2.索引列的長度
解決:前綴索引
3.數(shù)據(jù)類型選擇不合適
解決:選擇簡短的

八、如何獲取執(zhí)行計劃?如何理解執(zhí)行計劃的輸出?

desc或explain獲取執(zhí)行計劃


select_type:  查詢類型
table:         哪個表
type:         使用索引方式
key_len:    索引覆蓋長度
rows:        預(yù)估需要獲取的數(shù)據(jù)行
extra:       額外信息

九、聯(lián)合索引應(yīng)用有哪些原則?哪些情況不能覆蓋到聯(lián)合索引?

遵循最左原則。abc ab   a

沒有最左列。查詢條件中不等值查詢

十、索引有哪些自優(yōu)化能力?

ICP
MRR
CHANGE BUFFER
AHI

十一、mysql8.0在索引優(yōu)化中添加的新特性有哪些?

MySQL8.0 支持隱藏索引(invisible index),不可見索引
隱藏索引不會被優(yōu)化器使用,但需要維護。

降序索引
MySQL8.0真正支持降序索引(descending index)。
只有InnoDB存儲引擎支持降序索引,只支持BTREE降序索引


函數(shù)索引
MySQL8.0支持在索引中使用函數(shù)(表達式)的值。
支持降序索引,支持JSON數(shù)據(jù)索引。、

十二.請簡述優(yōu)化器算法:ICP/MRR是如何實現(xiàn)的?

ICP:在執(zhí)行多條件判斷時,判斷了第一個條件后,將過濾后的結(jié)果下推到引擎層繼續(xù)過濾剩余條件,最后再回表取出符合所有條件的行內(nèi)容.大大減少了回表IO

MRR:先將索引到的數(shù)據(jù)行放到緩存中read_rnd_buffer,然后進行排序,如果得到有序結(jié)果,就可以利用節(jié)點中的雙向指針一次IO取出多條數(shù)據(jù)(圖片為mariadb的,所以名稱稍有不同)

十三、1.3.14請說明索引應(yīng)用有哪些規(guī)范?


建索引原則
(1) 必須要有主鍵,如果沒有可以做為主鍵條件的列,創(chuàng)建無關(guān)列
(2) 經(jīng)常做為where條件列  order by  group by  join on, distinct 的條件(業(yè)務(wù):產(chǎn)品功能+用戶行為)
(3) 最好使用唯一值多的列作為索引,如果索引列重復(fù)值較多,可以考慮使用聯(lián)合索引
(4) 列值長度較長的索引列,我們建議使用前綴索引.
(5) 降低索引條目,一方面不要創(chuàng)建沒用索引,不常使用的索引清理,percona toolkit(xxxxx)
(6) 索引維護要避開業(yè)務(wù)繁忙期
不走索引的情況
(1)沒有查詢條件,或者查詢條件沒有建立索引
(2)查詢結(jié)果集是原表中的大部分數(shù)據(jù),應(yīng)該是15-25%以上
(3)索引本身失效,統(tǒng)計信息不真實
(4)查詢條件使用函數(shù)在索引列上,或者對索引列進行運算,運算包括(+,-,*,/,! 等)
(5)隱式轉(zhuǎn)換導致索引失效.這一點應(yīng)當引起重視.也是開發(fā)中經(jīng)常會犯的錯誤.
(6)<> ,not in 不走索引(輔助索引)
(7)like "%_" 百分號在最前面不走

SQL篇

1.請簡述select語句的各個子句的執(zhí)行順序?

select  from where group by having order by limit

2.請列舉SQL語句的種類和代表命令?

1.DDL數(shù)據(jù)定義語言
create 庫/表  drop 庫/表  alter 庫/表
2.DCL數(shù)據(jù)控制語言
GRANT為授權(quán)語句,對應(yīng)的REVOKE是撤銷授權(quán)語句。
3.DML數(shù)據(jù)操作語言
INSERT、UPDATE、DELETE三種指令為核心,分別代表插入、更新與刪除。
4.DQL數(shù)據(jù)查詢語言
其他DQL常用的保留字有FROM,WHERE,GROUP BY,HAVING和ORDER BY。這些DQL保留字常與其他類型的SQL語句一起使用。

3.請簡述SQL_MODE的作用?ONLY_FULL_GROUP_BY是干什么用的?

1.sql_mode 用來規(guī)范sql語句
2.ONLY_FULL_GROUP_BY用來控制group + 聚合函數(shù)。select list中的列,要么在group by  ,要么聚合函數(shù)操作。

4.請簡述MySQL utf8 和utf8mb4區(qū)別?

utf8 : 最大支持3個字節(jié)的字符
uft8mb4: 最大支持4字節(jié)長度字符。比如,emoji表情字符。

5.請簡述 tinyint int bigint 如何計算的存儲位數(shù)?

inyint  : 1字節(jié)長度。2^8 =256   , 0-255
int      : 4字節(jié)
bingint  :8字節(jié)

6.請簡述 char(10)和varchar(10)的區(qū)別,生產(chǎn)如何選擇?并闡述為什么?

char(11) :
定長 的字符串類型,在存儲字符串時,最大字符長度11個,立即分配11個字符長度的存儲空間,如果存不滿,空格填充。
varchar(11):
變長的字符串類型看,最大字符長度11個。在存儲字符串時,自動判斷字符長度,按需分配存儲空間。

7.請簡述datetime和timestamp區(qū)別?

DATETIME    8字節(jié)
范圍為從 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
TIMESTAMP    4字節(jié)
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。

8.請簡述你們數(shù)據(jù)庫開發(fā)過程,選擇數(shù)據(jù)類型的規(guī)范是什么?

a. 表名:不要出現(xiàn)大寫字母,不要有數(shù)字開頭,要和業(yè)務(wù)有關(guān),不能使用系統(tǒng)自帶關(guān)鍵字,盡量不要超過16字符。**
b. 表基本屬性:顯示設(shè)置engine,charset,對每個表設(shè)置comment**
c.列的數(shù)據(jù)類型:合適的,簡短的,足夠的、**
-d.約束:每個表要有主鍵,而且最好是自增數(shù)字列。每個表盡量設(shè)置NN,并設(shè)置默認值、**
e.其他:每個列要有注釋**

9.請列舉你了解的數(shù)據(jù)庫的約束有哪些?他們的特點是什么?

pk
not null
unique
unsigned

10.請簡述你們公司在Schema設(shè)計過程中有哪些開發(fā)規(guī)范?

名字: 小寫、16字符以內(nèi)、業(yè)務(wù)相關(guān)、不要用數(shù)字開頭、不要是預(yù)留字符串
設(shè)置字符集、存儲引擎顯式設(shè)置
數(shù)據(jù)類型:合適的、簡短的、足夠的
必須要有主鍵
每個列盡量非空,可以設(shè)置默認值
列名要有意義,不要預(yù)留字符,不要超過16字符
每個列、每個表都有注釋

11.數(shù)據(jù)庫范式有哪些?

第一范式(1NF):要求數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項。

第二范式(2NF):在1NF的基礎(chǔ)上,非碼屬性必須完全依賴于候選碼(在1NF基礎(chǔ)上消除非主屬性對主碼的部分函數(shù)依賴)
第二范式需要確保數(shù)據(jù)庫表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對聯(lián)合主鍵而言)。

第三范式(3NF):在2NF基礎(chǔ)上,任何非主屬性不依賴于其它非主屬性(在2NF基礎(chǔ)上消除傳遞依賴)
第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。

12.你們公司Online DDL如何處理的?

一般DDL操作最好都采用pt-osc或gh-ost這樣的工具來實施,并且實施之前務(wù)必要先檢查當前目標表上是否有事務(wù)或大查詢未結(jié)束,避免嚴重的MDL鎖等待
除了8.0以上版本,除了追加式新增列(追加式)、表改名、新增虛擬列這三種支持INSTANT的操作可以直接跑DDL,其余的都統(tǒng)統(tǒng)

采用pt-osc/gh-ost工具,相對更不容易出狀。
執(zhí)行ALTER TABLE DDL時,不要節(jié)外生枝指定ALGORITHM=?, LOCK=?選項,因為MySQL會自行判斷該采用哪種方式。本來可以INPLACE的,可能不小心給指定成COPY就悲劇了

13. 5.6、5.7、8.0在Online DDL的改變

ALTER TABLE時ALGORITHM可以指定的幾種方式:
COPY ,是指DDL時,會生成(臨時)新表,將原表數(shù)據(jù)逐行拷貝到新表中,在此期間會阻塞DML
INPLACE,無需拷貝全表數(shù)據(jù)到新表,但可能還是需要IN-PLACE方式(原地,無需生成新的臨時表)重建整表。這種情況下,在DDL的初始準備和最后結(jié)束兩個階段時通常需要加排他MDL鎖(metadata lock,元數(shù)據(jù)鎖),除此外,DDL期間不會阻塞DML
INSTANT,只需修改數(shù)據(jù)字典中的元數(shù)據(jù),無需拷貝數(shù)據(jù)也無需重建整表,同樣,也無需加排他MDL鎖,原表數(shù)據(jù)也不受影響。整個DDL過程幾乎是瞬間完成的,也不會阻塞DML。這個新特性是8.0.12引入的,再次感謝騰訊互娛DBA團隊的貢獻

14.簡述pt-osc或者gh-ost 第三方工具在處理DDL時的原理?

1.查看是否有從節(jié)點
2.查看是否有外鍵
3.創(chuàng)建新表
4.修改新表結(jié)構(gòu)
5.創(chuàng)建觸發(fā)器,保證拷貝過程中的數(shù)據(jù)同步
6.拷貝表數(shù)據(jù)
7.rename表
8.刪除舊表
9.刪除觸發(fā)器

15.請簡述drop table 、truncate table、delete from table的區(qū)別?

都能刪除表數(shù)據(jù)。
drop : 表結(jié)構(gòu)+表空間。
truncate : 表數(shù)據(jù),物理刪除表段,清空所有數(shù)據(jù)頁。立即釋放磁盤空間。
delete : 表數(shù)據(jù),邏輯刪除,打上刪除標記。不立即釋放磁盤空間。

16.請簡述如何利用update替換delete語句實現(xiàn)偽刪除

1.添加狀態(tài)列
2.delete命令替換為update
3.select 語句添加狀態(tài)條件

17.如果要你規(guī)劃一個10億的大表,你有什么好的方案?

索引應(yīng)用、存儲問題。

1、分區(qū)表
2、分布式架構(gòu)
3、歸檔表

18.如果這張10億單表已經(jīng)存在了,想要刪除1000W數(shù)據(jù)如何處理?

使用pt-archiver歸檔表
1.歸檔到數(shù)據(jù)庫
2.只清理數(shù)據(jù)
3.只把數(shù)據(jù)導出到外部文件,不刪除原表里的數(shù)據(jù)

19.生產(chǎn)中使用過分區(qū)表嗎?你們使用的是什么分表策略?分區(qū)表有什么優(yōu)勢和劣勢



range: 范圍分區(qū) 針對記錄字段的值在某個范圍 
我們一般按時間 范圍分區(qū)。

或者list:  列表分區(qū)  該分區(qū)的特點是某列的值只有有限個值,基于這樣的特點我們可以采用列表分區(qū)。

20.請簡述 group by 語句的執(zhí)行原理

分組列值進行排序、去重復(fù)、聚合函數(shù)其他列聚合。

21.Where和having語句的區(qū)別

having 是在where group by只夠做篩選的

22.生產(chǎn)中進行數(shù)據(jù)庫資產(chǎn)統(tǒng)計,都統(tǒng)計什么?如何統(tǒng)計?

information_schema.tables  系統(tǒng)表 
columns  根據(jù)列統(tǒng)計

23.請介紹你常用的聚合函數(shù)及其作用

avg  平均值
sum 求和
count 個數(shù)
min 最小值
max 最大值
group_count 將多行整合為一行

24.簡述多表連接的方式

笛卡爾
內(nèi)連接
外連接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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