查看更多寶典,請點擊《金三銀四,你的專屬面試寶典》html
MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL受權許可 MariaDB的目的是徹底兼容MySQL,包括API和命令行,使之能輕鬆成爲MySQL的代替品。在存儲引擎方面,使用XtraDB(英語:XtraDB)來代替MySQL的InnoDB。 MariaDB由MySQL的創始人Michael Widenius(英語:Michael Widenius)主導開發,他早前曾以10億美圓的價格,將本身建立的公司MySQL AB賣給了SUN,此後,隨着SUN被甲骨文收購,MySQL的全部權也落入Oracle的手中。MariaDB名稱來自Michael Widenius的女兒Maria的名字。mysql
MariaDB基於事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體,分支的開發者但願提供訪問即將到來的MySQL 5.4 InnoDB性能。這個版本還包括了 PrimeBase XT (PBXT) 和 FederatedX存儲引擎。面試
2.1 沒有鏈接到MySQL服務器,就想查看MySQL的版本。打開cmd,切換至mysql的bin目錄,運行下面的命令便可:sql
mysql -V 或 mysqladmin --version 或 mysql --help|find "Distrib"數據庫
2.2 若是已經鏈接到了MySQL服務器,則運行下面的命令:編程
select version(); 或 status 或 \s後端
2.3 在命令行鏈接上MySQL服務器時,其實就已經顯示了MySQL的版本,如:緩存
mysql -uroot -padmins安全
3.1 mysql密碼服務器
mysql初始密碼爲空,默認端口3306,默認最大鏈接數爲100;
修改密碼方式:
在DOS下進入目錄mysql\bin,而後鍵入如下命令:
mysqladmin -u用戶名 -p舊密碼 password 新密碼
如: mysqladmin -u root -p ab12 password djg345
3.2 命令行修改root密碼:
mysql> UPDATE mysql.user SET password=PASSWORD(’新密碼’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
顯示當前的user:
mysql> SELECT USER();
3.4 命令行下數據庫的操做
使用 show databases; 展現全部數據庫;
使用 use+數據庫名稱 進入或改變當前使用的數據庫;
使用 show+數據庫名稱 展現該數據庫下的全部表;
3.5 查看錶結構的方法:
登陸mysql,執行:
desc+表名 或 describe+表名 或 show columns from 表名 或 explain+表名;
使用mysql的工具mysqlshow.exe:
mysql+數據庫名稱+表名
3.6 如何導出與導入建表語句與數據
導出:mysqldump -uroot -padmins 數據庫名 表名 > database_dump.sql
導入:mysql -uroot -padmins 數據庫名 < database_dump.sql
3.7 如何備份全部數據庫
導出數據庫:mysqldump -uroot -padmins 數據庫名 > database.sql
導入數據庫:mysql -uroot -padmins 數據庫名 < database.sql
另外可使用圖形化界面進行導出導入
3.8 Mysql中有一個with rollup是用來在分組統計數據的基礎上再進行統計彙總,即用來獲得group by的彙總信息;
3.9 MySQL 臨時表在咱們須要保存一些臨時數據時是很是有用的。臨時表只在當前鏈接可見,當關閉鏈接時,Mysql會自動刪除表並釋放全部空間。
經過mysql> CREATE TEMPORARY TABLE 表名 建立臨時表,
數據庫引擎是用於存儲、處理和保護數據的核心服務。利用數據庫引擎可控制訪問權限並快速處理事務,從而知足企業內大多數須要處理大量數據的應用程序的要求。 使用數據庫引擎建立用於聯機事務處理或聯機分析處理數據的關係數據庫。這包括建立用於存儲數據的表和用於查看、管理和保護數據安全的數據庫對象(如索引、視圖和存儲過程)。
MYSQL支持三個引擎:ISAM、MYISAM和HEAP
另外兩種類型INNODB和BERKLEY(BDB),也經常可使用。若是技術高超,還可使用MySQL+API本身作一個引擎。
ISAM:ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之時就考慮到 數據庫被查詢的次數要遠大於更新的次數。所以,ISAM執行讀取操做的速度很快,並且不佔用大量的內存和存儲資源。ISAM的兩個主要不足之處在於,它不 支持事務處理,也不可以容錯:若是你的硬盤崩潰了,那麼數據文件就沒法恢復了。若是你正在把ISAM用在關鍵任務應用程序裏,那就必須常常備份你全部的實 時數據,經過其複製特性,MYSQL可以支持這樣的備份應用程序。
MyISAM:MyISAM是MySQL的ISAM擴展格式和缺省的數據庫引擎。除了提供ISAM裏所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個併發的讀寫操做,其代價是你須要常常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的擴展,例如用來修復數據庫文件的MyISAMCHK工具和用來恢復浪費空間的 MyISAMPACK工具。MYISAM強調了快速讀取操做,這可能就是爲何MySQL受到了WEB開發如此青睞的主要緣由:在WEB開發中你所進行的大量數據操做都是讀取操做。因此,大多數虛擬主機提供商和INTERNET平臺提供商只容許使用MYISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞後恢復數據。
HEAP:HEAP容許只駐留在內存裏的臨時表格。駐留在內存裏讓HEAP要比ISAM和MYISAM都快,可是它所管理的數據是不穩定的,並且若是在關機以前沒有進行保存,那麼全部的數據都會丟失。在數據行被刪除的時候,HEAP也不會浪費大量的空間。HEAP表格在你須要使用SELECT表達式來選擇和操控數據的時候很是有用。要記住,在用完表格以後就刪除表格。
InnoDB:InnoDB數據庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MYSQL+API。在使用MYSQL的時候,你所面對的每個挑戰幾乎都源於ISAM和MyISAM數據庫引擎不支持事務處理(transaction process)也不支持外來鍵。儘管要比ISAM和 MyISAM引擎慢不少,可是InnoDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,若是你的設計須要這些特性中的一者 或者二者,那你就要被迫使用後兩個引擎中的一個了。
若是感受本身的確技術高超,你還可以使用MySQL+API來建立本身的數據庫引擎。這個API爲你提供了操做字段、記錄、表格、數據庫、鏈接、安全賬號的功能,以及創建諸如MySQL這樣DBMS所須要的全部其餘無數功能。深刻講解API已經超出了本文的範圍,可是你須要瞭解MySQL+API的存在及其可交換引擎背後的技術,這一點是很重要的。估計這個插件式數據庫引擎的模型甚至可以被用來爲MySQL建立本地的XML提供器(XML provider)。(任何讀到本文的MySQL+API開發人員能夠把這一點看成是個要求。)
InnoDB和MyISAM是許多人在使用MySQL時最經常使用的兩個表類型,這兩個表類型各有優劣,視具體應用而定。基本的差異爲:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,可是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。
通常來講,MyISAM適合:
(1)作不少count 的計算; (2)插入不頻繁,查詢很是頻繁; (3)沒有事務。
InnoDB適合:
(1)可靠性要求比較高,或者要求事務; (2)表更新和查詢都至關的頻繁,而且表鎖定的機會比較大的狀況指定數據引擎的建立
如何查看MySQL的當前存儲引擎?
通常狀況下,mysql會默認提供多種存儲引擎,你能夠經過下面的查看:
看你的mysql如今已提供什麼存儲引擎:
mysql> show engines;
看你的mysql當前默認的存儲引擎:
mysql> show variables like '%storage_engine%';
你要看某個表用了什麼引擎(在顯示結果裏參數engine後面的就表示該表當前用的存儲引擎):
mysql> show create table 表名;
Mysql是由SQL接口,解析器,優化器,緩存,存儲引擎組成的。
數據庫一般不會被直接使用,而是由其餘編程語言經過SQL語句調用mysql,由mysql處理並返回執行結果。那麼Mysql接受到SQL語句後,又是如何處理的呢?
首先程序的請求會經過mysql的connectors與其進行交互,請求處處後,會暫時存放在鏈接池(connection pool)中並由處理器(Management Serveices & Utilities)管理。當該請求從等待隊列進入處處理隊列,管理器會將該請求丟給SQL接口(SQL Interface)。SQL接口接收到請求後,它會將請求進行hash處理並與緩存中的結果進行對比,若是徹底匹配則經過緩存直接返回處理結果;不然,須要完整的走一趟流程:
(1)由SQL接口丟給後面的解釋器(Parser),上面已經說到,解釋器會判斷SQL語句正確與否,若正確則將其轉化爲數據結構。
(2)解釋器處理完,便來到後面的優化器(Optimizer),它會產生多種執行計劃,最終數據庫會選擇最優化的方案去執行,儘快返會結果。
(3)肯定最優執行計劃後,SQL語句此時即可以交由存儲引擎(Engine)處理,存儲引擎將會到後端的存儲設備中取得相應的數據,並原路返回給程序。
DDL:數據定義語言
包含:
一、``CREATE` `: 在數據庫中建立新的數據對象
二、``ALTER` `: 修改數據庫中對象的數據結構
三、``DROP` `: 刪除數據庫中的對象
四、DISABLE/ENABLE ``TRIGGER` `: 修改觸發器的狀態
五、``UPDATE` `STATISTIC : 更新表/視圖統計信息
六、``TRUNCATE` `TABLE` `: 清空表中數據
七、COMMENT : 給數據對象添加註釋
八、RENAME : 更改數據對象名稱
DML:數據操做語言
包含:
一、``INSERT` `:將數據插入到表或視圖
二、``DELETE` `:從表或視圖刪除數據
三、``SELECT` `:從表或視圖中獲取數據
四、``UPDATE` `:更新表或視圖中的數據
五、MERGE : 對數據進行合併操做(插入/更新/刪除)
DCL:數據控制語言
包含:
一、``GRANT` `: 賦予用戶某種控制權限
二、``REVOKE` `:取消用戶某種控制權限
TCL:事務控制語言
包含:
一、``COMMIT` `: 保存已完成事務動做結果
二、SAVEPOINT : 保存事務相關數據和狀態用以可能的回滾操做
三、``ROLLBACK` `: 恢復事務相關數據至上一次``COMMIT``操做以後
四、``SET` `TRANSACTION` `: 設置事務選項
事務是併發控制的單位,是用戶定義的一個操做序列。這些操做要麼都作,要麼都不作,是一個不可分割的工做單位。
事務的ACID/四大特徵:
原子性:表示事務內操做不可分割。要麼都成功、要麼都是失敗;
一致性:要麼都成功、要麼都是失敗.後面的失敗了要對前面的操做進行回滾;
隔離性:一個事務開始後,不能後其餘事務干擾;
持久性/持續性:表示事務開始了,就不能終止。
髒讀:是指在一個事務處理過程裏讀取了另外一個未提交的事務中的數據。
當一個事務正在屢次修改某個數據,而在這個事務中這屢次的修改都還未提交,這時一個併發的事務來訪問該數據,就會形成兩個事務獲得的數據不一致。例如:用戶A向用戶B轉帳100元,對應SQL命令以下
update account set money=money+100 where name=’B’; (此時A通知B)
update account set money=money - 100 where name=’A’;
當只執行第一條SQL時,A通知B查看帳戶,B發現確實錢已到帳(此時即發生了髒讀),而以後不管第二條SQL是否執行,只要該事務不提交,則全部操做都將回滾,那麼當B之後再次查看帳戶時就會發現錢其實並無轉。
不可重複讀:是指在對於數據庫中的某個數據,一個事務範圍內屢次查詢卻返回了不一樣的數據值,這是因爲在查詢間隔,被另外一個事務修改並提交了。
例如事務T1在讀取某一數據,而事務T2立馬修改了這個數據而且提交事務給數據庫,事務T1再次讀取該數據就獲得了不一樣的結果,發送了不可重複讀。
不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另外一個事務未提交的髒數據,而不可重複讀則是讀取了前一事務提交的數據。
在某些狀況下,不可重複讀並非問題,好比咱們屢次查詢某個數據固然以最後查詢獲得的結果爲主。但在另外一些狀況下就有可能發生問題,例如對於同一個數據A和B依次查詢就可能不一樣,A和B就可能打起來了……
幻讀:是事務非獨立執行時發生的一種現象。
例如事務T1對一個表中全部的行的某個數據項作了從「1」修改成「2」的操做,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值仍是爲「1」而且提交給數據庫。而操做事務T1的用戶若是再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺同樣,這就是發生了幻讀。
幻讀和不可重複讀都是讀取了另外一條已經提交的事務(這點就髒讀不一樣),所不一樣的是不可重複讀查詢的都是同一個數據項,而幻讀針對的是一批數據總體(好比數據的個數)。
如今來看看MySQL數據庫爲咱們提供的四種隔離級別:
① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
③ Read committed (讀已提交):可避免髒讀的發生。
④ Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,固然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(相似於Java多線程中的鎖)使得其餘的線程只能在鎖外等待,因此平時選用何種隔離級別應該根據實際狀況。在MySQL數據庫中默認的隔離級別爲Repeatable read (可重複讀)。
在MySQL數據庫中,支持上面四種隔離級別,默認的爲Repeatable read (可重複讀);而在Oracle數據庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認的爲Read committed級別。
在MySQL數據庫中查看當前事務的隔離級別:
select @@tx_isolation;
在MySQL數據庫中設置事務的隔離級別:
set [glogal | session] transaction isolation level 隔離級別名稱;
set tx_isolation=’隔離級別名稱;’
索引用於快速找出在某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢數據所花費的時間就越多,若是表中查詢的列有一個索引,MySQL可以快速到達一個位置去搜索數據文件,而沒必要查看全部數據,那麼將會節省很大一部分時間。
索引咱們分爲四類來:
單列索引:一個索引只包含單個列,但一個表中能夠有多個單列索引。
斷裂索引又分爲:
普通索引:MySQL中基本索引類型,沒有什麼限制,容許在定義索引的列中插入重複值和空值,純粹爲了查詢數據更快一點。
惟一索引:索引列中的值必須是惟一的,可是容許爲空值。
主鍵索引:是一種特殊的惟一索引,不容許有空值。
組合索引:在表中的多個字段組合上建立的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合。
全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引,介紹了要求,說說什麼是全文索引,就是在一堆文字中,經過其中的某個關鍵字等,就能找到該字段所屬的記錄行,好比有"你是個大煞筆,二貨 ..." 經過大煞筆,可能就能夠找到該條記錄。
空間索引:空間索引是對空間數據類型的字段創建的索引,MySQL中的空間數據類型有四種,GEOMETRY、POINT、LINESTRING、POLYGON。
空間索引是對空間數據類型的字段創建的索引,MySQL中的空間數據類型有四種,GEOMETRY、POINT、LINESTRING、POLYGON。
在建立空間索引時,使用SPATIAL關鍵字。要求,引擎爲MyISAM,建立空間索引的列,必須將其聲明爲NOT NULL。
建立索引方法:
create index 索引名 on 表名(字段名);
alter table 表名 add index 索引名(字段名);
create table(id int not null,username varchar(10),index 索引名(username(length)));
刪除索引方法:
ALTER TABLE 表名 DROP INDEX 索引名;
DROP INDEX 索引名 ON 表名;
查看索引:
可使用 SHOW INDEX 命令來列出表中的相關的索引信息。能夠經過添加 \G 來格式化輸出信息。
如:mysql> SHOW INDEX FROM table_name; \G
1970年,R.Bayer和E.mccreight提出了一種適用於外查找的樹,它是一種平衡的多叉樹,稱爲B樹(或B-樹、B_樹)。
數據庫索引底層經常使用就是用就是B樹或者是B+樹這種結構
先說說樹吧,其實樹就是從一個根節點出發,其能夠有不少子節點,而子節點又能夠有不少子節點,這樣就像咱們現實生活中的樹同樣,不過咱們這顆樹是倒立的!由於樹的分支太多且沒有規律因此很難控制,要想讓樹發揮他的做用就得在基本的樹結構上加上一些特性,讓有了特性的樹成爲幫助咱們解決問題的結構,最經常使用的就是二叉樹了,二叉樹聽名字就知道是一個節點至多隻有兩個節點,這樣對數進行了必定的限制,整棵樹看起來就順眼多了。
二叉樹的拓展1:二叉搜索樹,二叉搜索樹的節點知足一個規律,父節點的左孩子的鍵值小於父節點的鍵值,而右孩子的鍵值大於父節點的鍵值,這樣當咱們在這顆數中查詢某個鍵值時就能夠根據當前節點的鍵值和要尋找的鍵值的大小比較,肯定該忘哪條路走下去。二叉搜索樹還有一個特色就是中序遍歷的時候其鍵值是按大小排序的。
二叉樹的拓展2:平衡二叉樹,因爲咱們要插入的數據多是自己就排好序的,因此會致使插入數據時樹變成線性的結構,只有一條路。。因而咱們須要保證二叉樹的平衡,當發現這棵樹要出現往一邊倒的狀況時就要想某種方式讓其保持平衡(葉子節點的高度差最大爲1),這就設計到一些節點的旋轉,變換了。
二叉樹的拓展3:紅黑樹,紅黑樹也是一種平衡二叉樹,不過加入了一些新的特性,聽名字就知道,在紅黑樹中節點的顏色要麼是紅色要麼是黑色的,固然還有其餘的一些特性,當插入或者刪除數據破壞了紅黑樹的這些特性時,咱們須要進行一些操做(通常是顏色改變和樹的旋轉)紅黑樹保持其原有的特性。
因爲二叉樹是二叉的,因此當樹的節點不斷增長時就會致使樹的高度不斷的增長,因此查詢的效率就很低了,當咱們面對海量數據(像數據庫中保存的數據)的時候這種結構是不行的,因此咱們又衍生出了新的樹結構。
二叉樹的拓展4:B樹,B數同樣擁有自平衡的特性,最大的區別在於B樹不是二叉的,而是多叉的,具體有多少個叉要根據樹的階數來判斷。
二叉樹的拓展5:B+樹,和B樹相比,B+樹又增長了一些特性,B+樹主要是爲了方便查詢一個區間的數據集合,由於咱們使用B樹的時候要想查詢某個區間內的數據得使用中序遍歷將樹中的數據所有遍歷一遍,這樣的時間複雜度是O(n),效率過低了。而B+樹只用葉子節點保存具體值的地址,非葉子節點只保存其子節點的指針,葉子節點之間經過指針連接起來,是有序的,因此在查找一個範圍內的數據是頗有效的。其時間複雜度爲O(logn+M),M爲要查找的數據個數。