目錄
1.什么是數據庫?
關系型數據庫
非關系型數據庫
2.Mysql出現性能差的原因?
3.MySQL的內聯,左外聯,右外連接的區別
?4.為什么要有三大范式
建表需要考慮的問題?
char和varchar的區別
blob和text的區別?
DATETIME和TIMESTAMP的區別
in和exists的區別
null值陷
5.記錄貨幣用什么類型比較好
6.怎么存儲emoji
7.DROP,DELETE,TRUNCATE的區別?
8.UNION和UNIONALL的區別
9.一條sql的執行流程
10.mysql中bin目錄下的執行文件
11.隱式數據類型轉換
1.什么是數據庫?
數據庫是按照數據結構來組織、存儲和管理數據的倉庫,它是計算機系統中用于高效存儲和處理數據的核心組件。分為關系型數據庫和非關系型數據庫.
關系型數據庫
采用關系模型(二維表格結構)來組織數據,強調數據的一致性和完整性,支持 SQL(結構化查詢語言)進行操作。
- MySQL:開源免費,性能穩定,易于部署和使用,是 Web 應用開發中最常用的數據庫之一。
- PostgreSQL:功能強大的開源關系型數據庫,支持復雜的數據類型和高級查詢,對事務的支持非常完善,適合對數據一致性要求高的企業級應用
- Oracle:商業級關系型數據庫,性能卓越,安全性高,支持大規模數據存儲和并發處理,廣泛應用于大型企業的核心業務系統,如銀行的交易系統、電信的客戶管理系統等。
- SQL Server:微軟推出的關系型數據庫,與 Windows 系統和.NET 平臺兼容性好,適合在微軟技術棧環境下開發的應用,如企業內部的管理系統等。
非關系型數據庫
- MongoDB:文檔型數據庫,數據以類似 JSON 的文檔形式存儲,結構靈活,適合存儲非結構化或半結構化數據,如博客文章、用戶評論、產品描述等。
- Redis:內存數據庫,讀寫速度極快,支持多種數據結構(字符串、哈希、列表、集合等),常被用作緩存、會話存儲、實時排行榜等場景。例如,電商網站的商品詳情頁緩存可以用 Redis 來提升訪問速度。
- Cassandra:分布式列存儲數據庫,具有高可用性、高擴展性和容錯能力,適合處理海量數據,如社交網絡的用戶行為數據、物聯網設備產生的海量日志數據等。
- Elasticsearch:基于 Lucene 的搜索引擎數據庫,擅長全文檢索和數據分析,常用于日志分析、商品搜索、企業內部文檔檢索等場景。
2.Mysql出現性能差的原因?
可能是 SQL 查詢使用了全表掃描,也可能是查詢語句過于復雜,如多表 JOIN 或嵌套子查詢。
也有可能是單表數據量過大。
鎖和并發問題
通常情況下,添加索引就能解決大部分性能問題。對于一些熱點數據,還可以通過增加 Redis 緩存,來減輕數據庫的訪問壓力。
3.MySQL的內聯,左外聯,右外連接的區別
連接類型 | 保留哪邊的所有行? | 匹配不到時如何處理? | 結果集特點 |
---|---|---|---|
INNER JOIN | 都不保留 | 直接丟棄 | 只保留兩邊都匹配上的行 |
LEFT JOIN | 保留左表所有行 | 右表補 NULL | 左表全有,右表補空 |
RIGHT JOIN | 保留右表所有行 | 左表補 NULL | 右表全有,左表補空 |
?4.為什么要有三大范式
第一范式: 列不可再分(原子性)
第二范式::非主屬性必須完全依賴于主鍵
第三范式:非主屬性不能依賴于其他的非主屬性
三大范式主要是防止數據冗余?
建表需要考慮的問題?
首先需要考慮表是否符合數據庫的三大范式,確保字段不可再分,消除非主鍵依賴,確保字段僅依賴于主鍵等。
然后在選擇字段類型時,應該盡量選擇合適的數據類型。
在字符集上,盡量選擇 utf8mb4,這樣不僅可以支持中文和英文,還可以支持表情符號等。
當數據量較大時,比如上千萬行數據,需要考慮分表。比如訂單表,可以采用水平分表的方式來分散單表存儲壓力。
char和varchar的區別
varchar是可變型的字符類型 char是固定長度
blob和text的區別?
blob是二進制的數據 比如圖片,視頻,音頻等,text是用來存儲文本數據
DATETIME和TIMESTAMP的區別
DATETIME 直接存儲日期和時間的完整值,與時區無關。默認是null
TIMESTAMP 存儲的是 Unix 時間戳,1970-01-01 00:00:01 UTC 以來的秒數,受時區影響。默認是當前的時間
in和exists的區別
in是子查詢,將子查詢的結果集用于外部內容,適用于結果集較小的情況?
in會有性能瓶頸,因為會建一個臨時表 存儲到內存中
exists會對外部每一行執行一次子查詢,關注點在于子查詢是否返回行 是則為ture,適用于子查詢結果集比較大的情況?
null值陷
IN
: 如果子查詢的結果集中包含?NULL
?值,可能會導致意外的結果。例如,WHERE column IN (subquery)
,如果?subquery
?返回?NULL
,則?column IN (subquery)
?永遠不會為真,除非?column
?本身也為?NULL
。
EXISTS
: 對?NULL
?值的處理更加直接。EXISTS
?只是檢查子查詢是否返回行,不關心行的具體值,因此不受?NULL
?值的影響。
5.記錄貨幣用什么類型比較好
DECIMAL
6.怎么存儲emoji
一般用UTF-8mb4字符集
7.DROP,DELETE,TRUNCATE的區別?
DROP 是物理刪除,用來刪除整張表,包括表結構,且不能回滾。
DELETE 支持行級刪除,可以帶 WHERE 條件,可以回滾。
TRUNCATE 用于清空表中的所有數據,但會保留表結構,不能回滾。
8.UNION和UNIONALL的區別
UNION會去重?
9.一條sql的執行流程
SQL 文本↓
[連接器] 認證、維持連接↓
[查詢緩存] 8.0 已廢棄↓
[解析器] 拆詞 → 語法樹↓
[預處理器] 語義檢查、權限校驗↓
[優化器] 選索引、生成執行計劃↓
[執行器] 調存儲引擎接口↓
[存儲引擎] 讀磁盤 → 內存 → 返回行↓
客戶端收到結果
10.mysql中bin目錄下的執行文件
- mysql:用于連接 MySQL 服務器
- mysqldump:用于數據庫備份,對數據備份、遷移或恢復時非常有用
- mysqladmin:用來執行一些管理操作,比如說創建數據庫、刪除數據庫、查看 MySQL 服務器的狀態等。
- mysqlcheck:用于檢查、修復、分析和優化數據庫表,對數據庫的維護和性能優化非常有用。
- mysqlimport:用于從文本文件中導入數據到數據庫表中,適合批量數據導入。
- mysqlshow:用于顯示 MySQL 數據庫服務器中的數據庫、表、列等信息。
- mysqlbinlog:用于查看 MySQL 二進制日志文件的內容,可以用于恢復數據、查看數據變更等
11.隱式數據類型轉換
當一個整數和一個浮點數相加時,整數會被轉換為浮點數。
SELECT 1 + 1.0; -- 結果為 2.0
當一個字符串和一個整數相加時,字符串會被轉換為整數。
SELECT '1' + 1; -- 結果為 2
隱式轉換會導致意想不到的結果,最好通過顯式轉換來規避
?