數據庫常見問題合集
數據庫知識點
-
事務的特性:
-
三大範式:
- 1>對屬性的原子性約束,要求屬性具備原子性,不可再分解.
- 2>對記錄要求有惟一性,一般設計一個主鍵來實現,主鍵不能包含業務邏輯.
- 3>對字段冗餘性約束,要求字段沒有冗餘.
-
主鍵
- 聯合主鍵:設置多個字段同時爲主鍵(PRIMARY KEY(Name, Age))
- 複合主鍵:多個主鍵聯合造成一個主鍵組合。(成績表中的學號、課程標號)
-
- 對比:
- 1.關係型數據庫經過外鍵關聯來創建表與表之間的關係,
- 2.非關係型數據庫一般指數據以對象的形式存儲在數據庫中,而對象之間的關係經過每一個對象自身的屬性來決定。
- 3.非關係型數據庫中,咱們查詢一條數據,結果出來一個數組,關係型數據庫中,查詢一條數據結果是一個對象。
- 關係型數據庫: Oracle、DB二、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>定時清除不須要的數據,定時進行碎片整理
-
- 避免使用 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
- 恢復:
bin>mysql -u root -p 要恢復的數據庫名<本地保存備份的路徑+文件名
MySQL -u root -p test < c:/test.sql
- 恢復時須要建立一個空的數據庫,再次對數據庫進行查詢時 表格 就會出來
- 注:文件名後綴能夠是txt,也能夠是sql
-
- 在MySQL中,char、varchar和text類型的字段均可以用來存儲字符類型的數據,
- char、varchar均可以指定最大的字符長度,但text不能夠。
- 它們的存儲方式和數據的檢索方式也都不同。
- 數據的檢索效率是:char > varchar > text
- 常常變化的字段用varchar;
- 知道固定長度的用char;
- 超過255字節的只能用varchar或者text;
- 能用varchar的地方不用text;
- 可以用數字類型的字段儘可能選擇數字類型而不用字符串類型,這會下降查詢和鏈接的性能,並會增長存儲開銷。這是由於引擎在處理查詢和鏈接回逐個比較字符串中每個字符,而對於數字型而言只須要比較一次就夠了;
- 同一張表出現多個大字段,能合併時儘可能合併,不能合併時考慮分表
-
-
-
- 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由於需求的不一樣,通常都是配合使用。
SQL語句的考查
-
SELECT S.name FROM Student S WHERE S.score > 80 GROUP BY S.name Having count(*)>=2;
- 思路:先找成績>80的數據,而後按住姓名分組,而後對分組後內容進行篩選。
- 注:沒有分組的狀況下having和Where 相似,有分組的時候 Where 對分組前內容過濾,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%';
-
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大的表。
-
-
END
歡迎關注本站公眾號,獲取更多信息