1、MySQLhtml
一、mysql如何作分頁mysql
mysql數據庫作分頁用limit關鍵字,它後面跟兩個參數startIndex和pageSize面試
二、mysql引擎有哪些,各自的特色是什麼?redis
http://www.cnblogs.com/ctztake/p/8453990.htmlsql
三、數據庫怎麼創建索引數據庫
create index account_index on `table name `(`字段名`(length)django
四、一張表多個字段,怎麼建立組合索引編程
create index account_index on `table name `(`字段名`,'字段名')windows
五、如何應對數據的高併發,大量的數據計算緩存
1.建立索引
2.數據庫讀寫分離,兩個數據庫,一個做爲寫,一個做爲讀
3. 外鍵去掉
4.django中orm表性能相關的
select_related:
對於一對一字段(OneToOneField)和外鍵字段(ForeignKey),可使用select_related 來對QuerySet進行優化。
select_related主要針一對一和多對一關係進行優化。 select_related使用SQL的JOIN語句進行優化,經過減小SQL查詢的次數來進行優化、提升性能。 能夠經過可變長參數指定須要select_related的字段名。也能夠經過使用雙下劃線「__」鏈接字段名來實現指定的遞歸查詢。 沒有指定的字段不會緩存,沒有指定的深度不會緩存,若是要訪問的話Django會再次進行SQL查詢。 也能夠經過depth參數指定遞歸的深度,Django會自動緩存指定深度內全部的字段。若是要訪問指定深度外的字段,Django會再次進行SQL查詢。 也接受無參數的調用,Django會盡量深的遞歸查詢全部的字段。但注意有Django遞歸的限制和性能的浪費。 Django >= 1.7,鏈式調用的select_related至關於使用可變長參數。Django < 1.7,鏈式調用會致使前邊的select_related失效,只保留最後一個。
prefetch_related:
對於多對多字段(ManyToManyField)和一對多字段,可使用prefetch_related()來進行優化。
prefetch_related()和select_related()的設計目的很類似,都是爲了減小SQL查詢的數量,可是實現的方式不同。後者是經過JOIN語句,在SQL查詢內解決問題。
可是對於多對多關係,使用SQL語句解決就顯得有些不太明智,由於JOIN獲得的表將會很長,會致使SQL語句運行時間的增長和內存佔用的增長。如有n個對象,每一個對象的多對多字段對應Mi條
,就會生成Σ(n)Mi 行的結果表。 prefetch_related()的解決方法是,分別查詢每一個表,而後用Python處理他們之間的關係。
由於select_related()老是在單次SQL查詢中解決問題,而prefetch_related()會對每一個相關表進行SQL查詢,所以select_related()的效率一般比後者高。 鑑於第一條,儘量的用select_related()解決問題。只有在select_related()不能解決問題的時候再去想prefetch_related()。 你能夠在一個QuerySet中同時使用select_related()和prefetch_related(),從而減小SQL查詢的次數。 只有prefetch_related()以前的select_related()是有效的,以後的將會被無視掉
六、數據庫內連表、左連表、右連表
內鏈接是根據某個條件鏈接兩個表共有的數據
左鏈接是根據某個條件以及左邊的錶鏈接數據,右邊的表沒有數據的話則爲null
右鏈接是根據某個條件以及右邊的錶鏈接數據,左邊的表沒有數據的話則爲null
七、視圖和表的區別
視圖是已經編譯好的sql語句,是基於sql語句的結果集的可視化的表,而表不是
視圖是窗口,表示內容
視圖沒有實際的物理記錄,而表有
視圖是虛表,表是實表
視圖的創建和刪除隻影響視圖自己,不影響對應的表
八、關係型數據庫的特色
數據集中控制
數據獨立性高
數據共享性好
數據冗餘度小
數據結構化
統一的數據保護能力
九、mysql數據庫都有哪些索引
普通索引:普通索引僅有一個功能:加速查找
惟一索引:惟一索引兩個功能:加速查找和惟一約束(可含null)
外鍵索引:外鍵索引兩個功能:加速查找和惟一約束(不可爲null)
聯合索引:聯合索引是將n個列組合成一個索引,應用場景:同時使用n列來進行查詢
觸發器
使用觸發器能夠定製用戶對錶進行【增、刪、改】操做時先後的行爲,注意:沒有查詢
特別的:NEW表示即將插入的數據行,OLD表示即將刪除的數據行。
二 使用觸發器
觸發器沒法由用戶直接調用,而知因爲對錶的【增/刪/改】操做被動引起的。
三 刪除觸發器
drop trigger tri_after_insert_cmd;
十、存儲過程
http://www.cnblogs.com/ctztake/p/7544559.html
存儲過程不容許執行return語句,可是能夠經過out參數返回多個值,存儲過程通常是做爲一個獨立的部分來執行,存儲過程是一個預編譯的SQL語句。
十一、sql優化:
選取最適用的字段屬性
使用鏈接(JOIN)來代替子查詢(Sub-Queries)
select句中避免使用 '*'
減小訪問數據庫的次數
刪除重複記錄
用where子句替代having子句
減小對錶的查詢
explain
十二、char和vachar區別:
char是固定長度,存儲須要空間12個字節,處理速度比vachar快,費內存空間,當存儲的值沒有達到指定的範圍時,會用空格替代
vachar是不固定長度,須要存儲空間13個字節,節約存儲空間,存儲的是真實的值,會在存儲的值前面加上1-2個字節,用來表示真實數據的大小
1三、Mechached與redis
mechached:只支持字符串,不能持久化,數據僅存在內存中,宕機或重啓數據將所有失效
不能進行分佈式擴展,文件沒法異步法。
優勢:mechached進程運行以後,會預申請一塊較大的內存空間,本身進行管理。
redis:支持服務器端的數據類型,redis與memcached相比來講,擁有更多的數據結構和併發支持更豐富的數據操做,可持久化。
五大類型數據:string、hash、list、set和有序集合,redis是單進程單線程的。
缺點:數據庫的容量受到物理內存的限制。
1四、sql注入
sql注入是比較常見的攻擊方式之一,針對編程員編程的疏忽,經過sql語句,實現帳號沒法登錄,甚至篡改數據庫。
防止:凡涉及到執行sql中有變量時,切記不要用拼接字符串的方法
1六、遊標是什麼?
是對查詢出來的結果集做爲一個單元來有效的處理,遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行,能夠對結果集當前行作修改,
通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要
1七、 數據庫支持多有標準的SQL數據類型,重要分爲三類
數值類型(tinyint,int,bigint,浮點數,bit)
字符串類型(char和vachar,enum,text,set)
日期類型(date,datetime,timestamp)
枚舉類型與集合類型
1八、mysql慢查詢
慢查詢對於跟蹤有問題的查詢頗有用,能夠分析出當前程序裏哪些sql語句比較耗費資源
慢查詢定義:
指mysql記錄全部執行超過long_query_time參數設定的時間值的sql語句,慢查詢日誌就是記錄這些sql的日誌。
mysql在windows系統中的配置文件通常是my.ini找到mysqld
log-slow-queries = F:\MySQL\log\mysqlslowquery.log 爲慢查詢日誌存放的位置,通常要有可寫權限
long_query_time = 2 2表示查詢超過兩秒才記錄
1九、memcached命中率
命中:能夠直接經過緩存獲取到須要的數據
不命中:沒法直接經過緩存獲取到想要的數據,須要再次查詢數據庫或者執行其餘的操做,緣由多是因爲緩存中根本不存在,或者緩存已通過期
緩存的命中率越高則表示使用緩存的收益越高,應額用的性能越好,抗病發能力越強
運行state命令能夠查看memcached服務的狀態信息,其中cmd—get表示總的get次數,get—hits表示命中次數,命中率=get—hits / cmd—get
20、Oracle和MySQL該如何選擇,爲何?
他們都有各自的優勢和缺點。考慮到時間因素,我傾向於MySQL
選擇MySQL而不選Oracle的緣由
MySQL開源
MySQL輕便快捷
MySQL對命令行和圖形界面的支持都很好
MySQL支持經過Query Browser進行管理
2一、什麼狀況下適合創建索引?
1.爲常常出如今關鍵字order by、group by、distinct後面的字段,創建索引
2.在union等集合操做的結果集字段上,創建索引,其創建索引的目的同上
3.爲常常用做查詢選擇的字段,創建索引
4.在常常用做錶鏈接的屬性上,創建索引
2二、數據庫底層是用什麼結構實現的,你大體畫一下:
底層用B+數實現,結構圖參考:
http://blog.csdn.net/cjfeii/article/details/10858721
http://blog.csdn.net/tonyxf121/article/details/8393545
2三、sql語句應該考慮哪些安全性?
1.防止sql注入,對特殊字符進行轉義,過濾或者使用預編譯的sql語句綁定變量
2.最小權限原則,特別是不要用root帳戶,爲不一樣的類型的動做或者組建使用不一樣的帳戶
3.當sql運行出錯時,不要把數據庫返回的錯誤信息所有顯示給用戶,以防止泄漏服務器和數據庫相關信息
2四、數據庫事物有哪幾種?
隔離性、持續性、一致性、原子性
2五、MySQ數據表在什麼狀況下容易損壞?
服務器忽然斷電致使數據文件損壞
強制關機,沒有先關閉mysq服務器等
2六、drop、delete與truncate的區別
當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,
DELETE操做不會減小表或索引所佔用的空間。
drop語句將表所佔用的空間全釋放掉。
1、delete 一、delete是DML,執行delete操做時,每次從表中刪除一行,而且同時將該行的的刪除操做記錄在redo和undo表空間中以便進行回滾(rollback)和重作操做,但要注意表空間要足夠大,
須要手動提交(commit)操做才能生效,能夠經過rollback撤消操做。 二、delete可根據條件刪除表中知足條件的數據,若是不指定where子句,那麼刪除表中全部記錄。 三、delete語句不影響表所佔用的extent,高水線(high watermark)保持原位置不變。 2、truncate 一、truncate是DDL,會隱式提交,因此,不能回滾,不會觸發觸發器。 二、truncate會刪除表中全部記錄,而且將從新設置高水線和全部的索引,缺省狀況下將空間釋放到minextents個extent,除非使用reuse storage,。不會記錄日誌,因此執行速度很快,
但不能經過rollback撤消操做(若是一不當心把一個表truncate掉,也是能夠恢復的,只是不能經過rollback來恢復)。 三、對於外鍵(foreignkey )約束引用的表,不能使用 truncate table,而應使用不帶 where 子句的 delete 語句。 四、truncatetable不能用於參與了索引視圖的表。 3、drop 一、drop是DDL,會隱式提交,因此,不能回滾,不會觸發觸發器。 二、drop語句刪除表結構及全部數據,並將表所佔用的空間所有釋放。 三、drop語句將刪除表的結構所依賴的約束,觸發器,索引,依賴於該表的存儲過程/函數將保留,可是變爲invalid狀態。
2七、數據庫範式
1.第一範式:就是無重複的列
2.第二範式:就是非主屬性非部分依賴於主關鍵字
3.第三範式:就是屬性不依賴於其餘非主屬性(消除冗餘)
2八、MySQL鎖類型
根據鎖的類型分:能夠分爲共享鎖、排他鎖、意向共享鎖和意向排他鎖
根據鎖的粒度分:能夠分爲行鎖、表鎖
對於mysql而言,事務機制更可能是靠底層的存儲引擎來實現的,所以,mysql層面只有表鎖,
而支持事物的innodb存儲引發則實現了行鎖(在行相應的索引記錄上的鎖)
說明:對於更新操做(讀不上鎖),只有走索引纔可能上行鎖
MVCC(多版本併發控制)併發控制機制下,任何操做都不會阻塞讀取操做,
讀取操做也不會阻塞任何操做,只由於讀不上鎖
共享鎖:由讀表操做加上的鎖,加鎖後其餘用戶只能獲取該表或行的共享鎖,不能獲取排他鎖,
也就是說只能讀不能寫
排他鎖:由寫表操做加上的鎖,加鎖後其餘用戶不能獲取該表或該行的任何鎖,典型mysql事物中的更新操做
意向共享鎖(IS):事物打算給數據行加行共享鎖,事物在給一個數據行加共享鎖前必須先取得該表的IS鎖
意向排他鎖(IX):事物打算給數據行加行排他鎖,事物在給一個數據行家排他鎖前必須先取得該表的IX鎖
2九、如何解決MYSQL數據庫中文亂碼問題?
1.在數據庫安裝的時候指定字符集
2.若是在按完了之後能夠更改配置文件
3.創建數據庫時候:指定字符集類型
4.建表的時候也指定字符集
30、數據庫應用系統設計
1.規劃 2.需求分析3.概念模型設計4.邏輯設計5.物理設計6. 程序編制及調試7.運行及維護 ps:數據庫常見面試問題總結