面筋分類匯總-測開向
數據庫知識點
-
事務的特性:
- 是指由構成單個邏輯處理單元的一組數據庫訪問操作,這些操作的SQL語句被封裝在一起,它們要么都被成功執行,要么都不被執行。
- 在關系數據庫中,一個事務程序可以由一條SQL語句組成,也可以由一組SQL語句組成。一個數據庫應用程序可以包含一個事務程序,也可以包含多個事務程序。
BEGIN;
SQL語句1;
SQL語句2;
...
SQL語句n;
COMMIT;
//其中每條語句執行后,並不立即提交數據庫,而是在執行COMMIT語句后,才將所有的SQL執行結果提交數據庫。
-
事務的特性:
- 原子性、一致性、隔離性、持久性。
- 原子性:事務中SQL語句對數據的修改操作,要么全部正確地執行,要么全部都不執行。
- 一致性:事務的執行結果從數據庫一種正確數據狀態變遷到另一種正確數據狀態。
- 隔離性:當多個事務並發執行時,一個事務的執行不能被其他事務干擾,即各個並發事務之間不能相互影響。
- 持續性:一個事務一旦提交,它對數據庫中的數據的改變應該是永久的。
-
事務並發運行時可能會出現的問題:臟讀、不可重復讀、幻像讀、丟失更新問題
-
三大范式:
- 1>對屬性的原子性約束,要求屬性具有原子性,不可再分解.
- 2>對記錄要求有唯一性,通常設計一個主鍵來實現,主鍵不能包含業務邏輯.
- 3>對字段冗余性約束,要求字段沒有冗余.
-
主鍵
- 聯合主鍵:設置多個字段同時為主鍵(PRIMARY KEY(Name, Age))
- 復合主鍵:多個主鍵聯合形成一個主鍵組合。(成績表中的學號、課程標號)
-
關系型數據庫與NOSQL
- 對比:
- 1.關系型數據庫通過外鍵關聯來建立表與表之間的關系,
- 2.非關系型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關系通過每個對象自身的屬性來決定。
- 3.非關系型數據庫中,我們查詢一條數據,結果出來一個數組,關系型數據庫中,查詢一條數據結果是一個對象。
- 關系型數據庫: Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
- 非關系型數據庫:NOSQL(Not Only SQL)
- NOSQL特點:用於高並發讀寫、海量數據的高效率存儲和訪問、高可擴展性和高可用性。
- 易擴展,數據之間沒有關系的。
- 大數據量,高性能。高性能讀寫非常靈活的。
- 靈活的數據模型。不需要事先對存儲數據建立字段。
- 高可用。
- NOSQL主要主流產品:
- Redis、CouchDB、mongoDB、Cassandra。
- NOSQL中比較火的三個數據庫Redis、Memchache、MongoDb。
- 對比:
-
數據庫優化
- 1>數據庫設計--三大范式
- 2>數據庫索引
- 3>分表分庫(水平分割,垂直分割)
- 4>讀寫分離
- 5>存儲過程(模塊化編程,可以提高速度)
- 6>對MySQL配置優化(配置最大並發數my.ini,調整緩存大小)
- 7>SQL調優
- 8>定時清除不需要的數據,定時進行碎片整理
-
mysql怎么優化
- 避免使用 select *
- 當你只需要查詢出一條數據的時候,要使用 limit 1
- 建立高性能的索引
- 建數據庫表時,給字段設置固定合適的大小.
- 要盡量使用not null
- EXPLAIN 你的 SELECT 查詢
- 在Join表的時候,被用來Join的字段,應該是相同的類型的,且字段應該是被建過索引的,這樣,MySQL內部會啟動為你優化Join的SQL語句的機制。
- 如果你有一個字段,比如“性別”,“國家”,“民族”, “省份”,“狀態”或“部門”,這些字段的取值是有限而且固定的,那么,應該使用 ENUM 而不是 VARCHAR。
- 垂直分割
- 優化where查詢
- ①. 避免在where子句中對字段進行表達式操作
- ②. 應盡量避免在 where 子句中使用 !=或<> 操作符,否則將引擎放棄使用索引而進行全表掃描。
- ③. 應盡量避免在 where 子句中對字段進行 null 值 判斷
- ④. 應盡量避免在 where 子句中使用 or 來連接條件
- 不建議使用%前綴模糊查詢,這種查詢會導致索引失效而進行全表掃描
- 要慎用in和 not in
- 理解in和exists, not in和not exists的區別
- 理解select Count (*)和Select Count(1)以及Select Count(column)區別
-
數據庫的備份是如何實現的
- 備份:
bin>mysqldump -u root -p 要備份的數據庫名>本地保存備份的路徑+文件名
- 不用進行登錄,將數據庫 test 備份 到c盤的test.sql 文件里:
mysqldump -u root -p test >c:/test.sql
- 不用進行登錄,將數據庫 test 備份 到c盤的test.sql 文件里:
- 恢復:
bin>mysql -u root -p 要恢復的數據庫名<本地保存備份的路徑+文件名
MySQL -u root -p test < c:/test.sql
- 恢復時需要創建一個空的數據庫,再次對數據庫進行查詢時 表格 就會出來
- 注:文件名后綴可以是txt,也可以是sql
- 備份:
-
MySQL中char、varchar和text三者的區別
- 在MySQL中,char、varchar和text類型的字段都可以用來存儲字符類型的數據,
- char、varchar都可以指定最大的字符長度,但text不可以。
- 它們的存儲方式和數據的檢索方式也都不一樣。
- 數據的檢索效率是:char > varchar > text
- 經常變化的字段用varchar;
- 知道固定長度的用char;
- 超過255字節的只能用varchar或者text;
- 能用varchar的地方不用text;
- 能夠用數字類型的字段盡量選擇數字類型而不用字符串類型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接回逐個比較字符串中每一個字符,而對於數字型而言只需要比較一次就夠了;
- 同一張表出現多個大字段,能合並時盡量合並,不能合並時考慮分表
-
微服務
-
MVC
-
redis相關問題](https://baijiahao.baidu.com/s?id=1660009541007805174&wfr=spider&for=pc)
- redis都有哪些了解
- Redis 是 C 語言開發的一個開源的(遵從 BSD 協議)高性能鍵值對(key-value)的內存數據庫,可以用作數據庫、緩存、消息中間件等。
- 它是一種 NoSQL(not-only sql,泛指非關系型數據庫)的數據庫。
- Redis 作為一個內存數據庫:
- 性能優秀,數據在內存中,讀寫速度非常快,支持並發 10W QPS。單進程單線程,是線程安全的,采用 IO 多路復用機制。豐富的數據類型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。支持數據持久化。可以將內存中數據保存在磁盤中,重啟時加載。主從復制,哨兵,高可用。可以用作分布式鎖。可以作為消息中間件使用,支持發布訂閱
- redis支持哪些數據類型
- 支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
- String
- Redis 最基本的類型,一個 Key 對應一個 Value。Value 不僅是 String,也可以是數字。
- String 類型是二進制安全的,意思是 Redis 的 String 類型可以包含任何數據,比如 jpg 圖片或者序列化的對象。String 類型的值最大能存儲 512M。
- Hash
- 一個鍵值(key-value)的集合。
- Redis 的 Hash 是一個 String 的 Key 和 Value 的映射表,Hash 特別適合存儲對象。常用命令:hget,hset,hgetall 等。
- List 列表
- 簡單的字符串列表,按照插入順序排序。可以添加一個元素到列表的頭部(左邊)或者尾部(右邊) 常用命令:lpush、rpush、lpop、rpop、lrange(獲取列表片段)等。
- 數據結構:List 就是鏈表,可以用來當消息隊列用。Redis 提供了 List 的 Push 和 Pop 操作,還提供了操作某一段的 API,可以直接查詢或者刪除某一段的元素。
- 實現方式:Redis List 的是實現是一個雙向鏈表,既可以支持反向查找和遍歷,更方便操作,不過帶來了額外的內存開銷。
- Set
- String 類型的無序集合。集合是通過 hashtable 實現的。Set 中的元素是沒有順序的,而且是沒有重復的。常用命令:sdd、spop、smembers、sunion 等。
- 應用場景:Redis Set 對外提供的功能和 List 一樣是一個列表,特殊之處在於 Set 是自動去重的,而且 Set 提供了判斷某個成員是否在一個 Set 集合中。
- Zset
- 和 Set 一樣是 String 類型元素的集合,且不允許重復的元素。常用命令:zadd、zrange、zrem、zcard 等。
- 使用場景:Sorted Set 可以通過用戶額外提供一個優先級(score)的參數來為成員排序,並且是插入有序的,即自動排序。
- 當你需要一個有序的並且不重復的集合列表,那么可以選擇 Sorted Set 結構。
- 和 Set 相比,Sorted Set關聯了一個 Double 類型權重的參數 Score,使得集合中的元素能夠按照 Score 進行有序排列,Redis 正是通過分數來為集合中的成員進行從小到大的排序。
- 實現方式:Redis Sorted Set 的內部使用 HashMap 和跳躍表(skipList)來保證數據的存儲和有序,HashMap 里放的是成員到 Score 的映射。
- redis是單線程還是多線程的,為什么這樣設計?
- 單進程單線程,是線程安全的。
- 因為 Redis 完全是基於內存的操作,CPU 不是 Redis 的瓶頸,Redis 的瓶頸最有可能是機器內存的大小或者網絡帶寬。
- 既然單線程容易實現,而且 CPU 不會成為瓶頸,那就順理成章的采用單線程的方案了(畢竟采用多線程會有很多麻煩)。
- Redis 完全基於內存,絕大部分請求是純粹的內存操作,非常迅速,數據存在內存中,類似於 HashMap,HashMap 的優勢就是查找和操作的時間復雜度是 O(1)。數據結構簡單,對數據操作也簡單。
- 采用單線程,避免了不必要的上下文切換和競爭條件,不存在多線程導致的 CPU 切換,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有死鎖問題導致的性能消耗。使用多路復用 IO 模型,非阻塞 IO。
- 單進程單線程,是線程安全的。
- redis和mysql的區別總結
- (1)類型上:從類型上來說,mysql是關系型數據庫,redis是緩存數據庫
- (2)作用上:
- mysql用於持久化的存儲數據到硬盤,功能強大,但是速度較慢
- redis用於存儲使用較為頻繁的數據到緩存中,讀取速度快
- (3)需求上:mysql和redis因為需求的不同,一般都是配合使用。
- redis都有哪些了解
SQL語句的考查
-
學生成績單里兩門成績>80的學生名字
SELECT S.name FROM Student S WHERE S.score > 80 GROUP BY S.name Having count(*)>=2;
- 思路:先找成績>80的數據,然后按住姓名分組,然后對分組后內容進行篩選。
- 注:沒有分組的情況下having和Where 類似,有分組的時候 Where 對分組前內容過濾,having是分組后的內容進行篩選。
- having 里面可以寫聚合函數,
-
創建數據庫:
CREATE DATABASE database_name;
-
mysql創建一個學生表,包含id(int)和name(string)
- 主鍵的創建:CREATE TABLE stu(id INT (5), name VARCHAR (100), PRIMARY KEY (id));
-
mysql建立索引
CREATE INDEX index_name ON table_name (column_list) CREATE INDEX idx_c4 ON t(c4);
-
數據庫查詢10-20行內容:
select * from stu limit 10, 10;
-
查找135開頭的電話:
select * from table where tel like '135%';
-
查出“張”姓學生中平均成績大於75分的學生信息
select * from student where name in (select name from student where name like '張%' group by name having avg(score) > 75)
-
連接:內連接、外連接
-
left join, right join和inner join的影響性能的因素。
- 如果兩個表一樣大,效率是一樣的。
- 如果兩個表的數據量相來差很大,那效率上是有區別的。
- 一般來說,小表去join大表,效率要比大表去join小表高的多。
- 通常SQL會自動去選擇百效率好的查詢方案。但如果在join之前已經有很多的join,那SQL一般會按join出現的順序進行查詢。
- 所以寫SQL盡量度先查詢和過濾數據量小的表,再去join大的表。
-
必會SQL筆試題
-
學習總結:SQL的學習-匯總