int类型存小数 mysql_2020年最新版MySQL面试题(一)
數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)
一、為什么要使用數(shù)據(jù)庫(kù)
1.數(shù)據(jù)保存在內(nèi)存
- 優(yōu)點(diǎn):存取速度快
- 缺點(diǎn):數(shù)據(jù)不能永久保存
2.數(shù)據(jù)保存在文件
- 優(yōu)點(diǎn):數(shù)據(jù)永久保存
- 缺點(diǎn):①速度比內(nèi)存操作慢,頻繁的IO操作;②查詢數(shù)據(jù)不方便。
3.數(shù)據(jù)保存在數(shù)據(jù)庫(kù)
①數(shù)據(jù)永久保存;②使用SQL語(yǔ)句,查詢方便效率高;③管理數(shù)據(jù)方便。
二、什么是SQL?
定義:結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)簡(jiǎn)稱SQL,是一種數(shù)據(jù)庫(kù)查詢語(yǔ)言。
作用:用于存取數(shù)據(jù)、查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。
三、什么是MySQL?
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。在PHP企業(yè)級(jí)開發(fā)中非常常用,因?yàn)?MySQL 是開源免費(fèi)的,并且方便擴(kuò)展。
四、數(shù)據(jù)庫(kù)三大范式是什么?
- 第一范式:每個(gè)列都不可以再拆分。
- 第二范式:在第一范式的基礎(chǔ)上,非主鍵列完全依賴于主鍵,而不能是依賴于主鍵的一部分。
- 第三范式:在第二范式的基礎(chǔ)上,非主鍵列只依賴于主鍵,不依賴于其他非主鍵。
在設(shè)計(jì)數(shù)據(jù)庫(kù)結(jié)構(gòu)的時(shí)候,要盡量遵守三范式,如果不遵守,必須有足夠的理由。比如性能。事實(shí)上我們經(jīng)常會(huì)為了性能而妥協(xié)數(shù)據(jù)庫(kù)的設(shè)計(jì)。
五、mysql有關(guān)權(quán)限的表都有哪幾個(gè)?
MySQL服務(wù)器通過權(quán)限表來(lái)控制用戶對(duì)數(shù)據(jù)庫(kù)的訪問,權(quán)限表存放在mysql數(shù)據(jù)庫(kù)里,由mysql_install_db腳本初始化。這些權(quán)限表分別user,db,table_priv,columns_priv和host。
下面分別介紹一下這些表的結(jié)構(gòu)和內(nèi)容:
- user權(quán)限表:記錄允許連接到服務(wù)器的用戶帳號(hào)信息,里面的權(quán)限是全局級(jí)的。
- db權(quán)限表:記錄各個(gè)帳號(hào)在各個(gè)數(shù)據(jù)庫(kù)上的操作權(quán)限。
- table_priv權(quán)限表:記錄數(shù)據(jù)表級(jí)的操作權(quán)限。
- columns_priv權(quán)限表:記錄數(shù)據(jù)列級(jí)的操作權(quán)限。
- host權(quán)限表:配合db權(quán)限表對(duì)給定主機(jī)上數(shù)據(jù)庫(kù)級(jí)操作權(quán)限作更細(xì)致的控制。這個(gè)權(quán)限表不受GRANT和REVOKE語(yǔ)句的影響。
六、MySQL的binlog有有幾種錄入格式?分別有什么區(qū)別?
有三種格式,statement,row和mixed。
- statement模式下,每一條會(huì)修改數(shù)據(jù)的sql都會(huì)記錄在binlog中。不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,提高性能。由于sql的執(zhí)行是有上下文的,因此在保存的時(shí)候需要保存相關(guān)的信息,同時(shí)還有一些使用了函數(shù)之類的語(yǔ)句無(wú)法被記錄復(fù)制。
- row級(jí)別下,不記錄sql語(yǔ)句上下文相關(guān)信息,僅保存哪條記錄被修改。記錄單元為每一行的改動(dòng),基本是可以全部記下來(lái)但是由于很多操作,會(huì)導(dǎo)致大量行的改動(dòng)(比如alter table),因此這種模式的文件保存的信息太多,日志量太大。
- mixed,一種折中的方案,普通操作使用statement記錄,當(dāng)無(wú)法使用statement的時(shí)候使用row。
此外,新版的MySQL中對(duì)row級(jí)別也做了一些優(yōu)化,當(dāng)表結(jié)構(gòu)發(fā)生變化的時(shí)候,會(huì)記錄語(yǔ)句而不是逐行記錄。
數(shù)據(jù)類型
一、mysql有哪些數(shù)據(jù)類型?
1.整數(shù)類型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。
- 分別表示1字節(jié)、2字節(jié)、3字節(jié)、4字節(jié)、8字節(jié)整數(shù)。任何整數(shù)類型都可以加上UNSIGNED屬性,表示數(shù)據(jù)是無(wú)符號(hào)的,即非負(fù)整數(shù)。
- 長(zhǎng)度:整數(shù)類型可以被指定長(zhǎng)度。例如:INT(11)表示長(zhǎng)度為11的INT類型。長(zhǎng)度在大多數(shù)場(chǎng)景是沒有意義的,它不會(huì)限制值的合法范圍,只會(huì)影響顯示字符的個(gè)數(shù),而且需要和UNSIGNED ZEROFILL屬性配合使用才有意義。
- 例子。假定類型設(shè)定為INT(5),屬性為UNSIGNED ZEROFILL,如果用戶插入的數(shù)據(jù)為12的話,那么數(shù)據(jù)庫(kù)實(shí)際存儲(chǔ)數(shù)據(jù)為00012。
2.實(shí)數(shù)類型,包括FLOAT、DOUBLE、DECIMAL。
- DECIMAL可以用于存儲(chǔ)比BIGINT還大的整型,能存儲(chǔ)精確的小數(shù)。
- 而FLOAT和DOUBLE是有取值范圍的,并支持使用標(biāo)準(zhǔn)的浮點(diǎn)進(jìn)行近似計(jì)算。
- 計(jì)算時(shí)FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串進(jìn)行處理。
3.字符串類型,包括VARCHAR、CHAR、TEXT、BLOB。
- VARCHAR用于存儲(chǔ)可變長(zhǎng)字符串,它比定長(zhǎng)類型更節(jié)省空間。
- VARCHAR使用額外1或2個(gè)字節(jié)存儲(chǔ)字符串長(zhǎng)度。列長(zhǎng)度小于255字節(jié)時(shí),使用1字節(jié)表示,否則使用2字節(jié)表示。
- VARCHAR存儲(chǔ)的內(nèi)容超出設(shè)置的長(zhǎng)度時(shí),內(nèi)容會(huì)被截?cái)唷?/li>
- CHAR是定長(zhǎng)的,根據(jù)定義的字符串長(zhǎng)度分配足夠的空間。
- CHAR會(huì)根據(jù)需要使用空格進(jìn)行填充方便比較。
- CHAR適合存儲(chǔ)很短的字符串,或者所有值都接近同一個(gè)長(zhǎng)度。
- CHAR存儲(chǔ)的內(nèi)容超出設(shè)置的長(zhǎng)度時(shí),內(nèi)容同樣會(huì)被截?cái)唷?/li>
使用策略:
對(duì)于經(jīng)常變更的數(shù)據(jù)來(lái)說(shuō),CHAR比VARCHAR更好,因?yàn)镃HAR不容易產(chǎn)生碎片。
對(duì)于非常短的列,CHAR比VARCHAR在存儲(chǔ)空間上更有效率。
使用時(shí)要注意只分配需要的空間,更長(zhǎng)的列排序時(shí)會(huì)消耗更多內(nèi)存。
盡量避免使用TEXT/BLOB類型,查詢時(shí)會(huì)使用臨時(shí)表,導(dǎo)致嚴(yán)重的性能開銷。
4.枚舉類型(ENUM),把不重復(fù)的數(shù)據(jù)存儲(chǔ)為一個(gè)預(yù)定義的集合。
- 有時(shí)可以使用ENUM代替常用的字符串類型。
- ENUM存儲(chǔ)非常緊湊,會(huì)把列表值壓縮到一個(gè)或兩個(gè)字節(jié)。
- ENUM在內(nèi)部存儲(chǔ)時(shí),其實(shí)存的是整數(shù)。
- 盡量避免使用數(shù)字作為ENUM枚舉的常量,因?yàn)槿菀谆靵y。
- 排序是按照內(nèi)部存儲(chǔ)的整數(shù)
5.日期和時(shí)間類型,盡量使用timestamp,空間效率高于datetime,用整數(shù)保存時(shí)間戳通常不方便處理。
- 如果需要存儲(chǔ)微妙,可以使用bigint存儲(chǔ)。
- 看到這里,這道真題是不是就比較容易回答了。
引擎
一、MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別
存儲(chǔ)引擎Storage engine:MySQL中的數(shù)據(jù)、索引以及其他對(duì)象是如何存儲(chǔ)的,是一套文件系統(tǒng)的實(shí)現(xiàn)。
常用的存儲(chǔ)引擎有以下:
- Innodb引擎:Innodb引擎提供了對(duì)數(shù)據(jù)庫(kù)ACID事務(wù)的支持。并且還提供了行級(jí)鎖和外鍵的約束。它的設(shè)計(jì)的目標(biāo)就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫(kù)系統(tǒng)。
- MyIASM引擎(原本Mysql的默認(rèn)引擎):不提供事務(wù)的支持,也不支持行級(jí)鎖和外鍵。
- MEMORY引擎:所有的數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)的處理速度快,但是安全性不高。
二、MyISAM與InnoDB區(qū)別
三、MyISAM索引與InnoDB索引的區(qū)別?
- InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
- InnoDB的主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)著行數(shù)據(jù),因此主鍵索引非常高效。
- MyISAM索引的葉子節(jié)點(diǎn)存儲(chǔ)的是行數(shù)據(jù)地址,需要再尋址一次才能得到數(shù)據(jù)。
- InnoDB非主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵和其他帶索引的列數(shù)據(jù),因此查詢時(shí)做到覆蓋索引會(huì)非常高效。
四、InnoDB引擎的4大特性
- 插入緩沖(insert buffer)
- 二次寫(double write)
- 自適應(yīng)哈希索引(ahi)
- 預(yù)讀(read ahead)
五、存儲(chǔ)引擎選擇
如果沒有特別的需求,使用默認(rèn)的Innodb即可。
- MyISAM:以讀寫插入為主的應(yīng)用程序,比如博客系統(tǒng)、新聞門戶網(wǎng)站。
- Innodb:更新(刪除)操作頻率也高,或者要保證數(shù)據(jù)的完整性;并發(fā)量高,支持事務(wù)和外鍵。比如OA自動(dòng)化辦公系統(tǒng)。
來(lái)源:https://blog.csdn.net/ThinkWon/article/details/104778621
總結(jié)
以上是生活随笔為你收集整理的int类型存小数 mysql_2020年最新版MySQL面试题(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 还原九宫格图片_用Pyth
- 下一篇: 超标量体系结构_CPU体系结构以及指令流