Mysql的一些問題

sql語句應該考慮哪些安全性?
答:
(1)防止sql注入,對特殊字符進行轉義,過濾或者使用預編譯的sql語句綁定變量。
(2)最小權限原則,特別是不要用root帳戶,爲不一樣的類型的動做或者組建使用不一樣的帳戶。
(3)當sql運行出錯時,不要把數據庫返回的錯誤信息所有顯示給用戶,以防止泄漏服務器和數據庫相關信息。mysql

簡單描述MySQL中,索引,主鍵,惟一索引,聯合索引的區別,對數據庫的性能有什麼影響。
答:
(1)索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏全部記錄的引用指針。
(2)普通索引(由關鍵字KEY或INDEX定義的索引)的惟一任務是加快對數據的訪問速度。
(3)普通索引容許被索引的數據列包含重複的值,若是能肯定某個數據列只包含彼此各不相同的值,在爲這個數據索引建立索引的時候就應該用關鍵字UNIQE把它定義爲一個惟一因此,惟一索引能夠保證數據記錄的惟一性。
(4)主鍵,一種特殊的惟一索引,在一張表中只能定義一個主鍵索引,逐漸用於惟一標識一條記錄,是用關鍵字PRIMARY KEY來建立。
(5)索引能夠覆蓋多個數據列,如像INDEX索引,這就是聯合索引。
(6)索引能夠極大的提升數據的查詢速度,可是會下降插入刪除更新表的速度,由於在執行這些寫操做時,還要操做索引文件。sql

一張表,裏面有ID自增主鍵,當insert了17條記錄以後,刪除了第15,16,17條記錄,再把mysql重啓,再insert一條記錄,這條記錄的ID是18仍是15 ?
答:
(1)若是表的類型是MyISAM,那麼是18。
由於MyISAM表會把自增主鍵的最大ID記錄到數據文件裏,重啓MySQL自增主鍵的最大ID也不會丟失。
(2)若是表的類型是InnoDB,那麼是15。
InnoDB表只是把自增主鍵的最大ID記錄到內存中,因此重啓數據庫或者是對錶進行OPTIMIZE操做,都會致使最大ID丟失。數據庫

請簡述項目中優化sql語句執行效率的方法,從哪些方面。sql語句性能如何分析?
答:
(1)儘可能選擇較小的列
(2)將where中用的比較頻繁的字段創建索引
(3)select子句中避免使用‘*’
(4)避免在索引列上使用計算,not,in和<>等操做
(5)當只須要一行數據的時候使用limit 1
(6)保證表單數據不超過200w,適時分割表
(7)針對查詢較慢的語句,可使用explain來分析該語句具體的執行狀況
mysql_fetch_row()和mysql_fetch_array()的區別
答:這兩個函數,返回的都是一個數組,區別就是第一個函數返回的數組是隻包含值,咱們只能row[0],row[1],這樣以數組下標來讀取數據,而mysql_fetch_array()返回的數組既包含第一種,也包含鍵值對的形式,咱們能夠這樣讀取數據,(假如數據庫的字段是 username,passwd):row[‘username‘],row[‘passwd‘。數組

數據庫事務的四個特性及含義安全

數據庫事務transanction正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、持久性(Durability)。
原子性:整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
一致性:在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。
隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的惟一操做。若是有兩個事務,運行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認爲只有該事務在使用系統。這種屬性有時稱爲串行化,爲了防止事務操做間的混淆,必須串行化或序列化請 求,使得在同一時間僅有一個請求用於同一數據。
持久性:在事務完成之後,該事務所對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾。服務器

視圖的做用數據結構

視圖是虛擬的表,與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢;不包含任何列或數據。使用視圖能夠簡化複雜的sql操做,隱藏具體的細節,保護數據;視圖建立後,可使用與表相同的方式利用它們。
視圖不能被索引,也不能有關聯的觸發器或默認值,若是視圖自己內有order by 則對視圖再次order by將被覆蓋。
建立視圖:create view XXX as XXXXXXXXXXXXXX;
對於某些視圖好比未使用聯結子查詢分組彙集函數Distinct Union等,是能夠對其更新的,對視圖的更新將對基表進行更新;可是視圖主要用於簡化檢索,保護數據,並不用於更新,並且大部分視圖都不能夠更新數據庫設計

drop,delete與truncate的區別函數

drop直接刪掉表 truncate刪除表中數據,再插入時自增加id又從1開始 delete刪除表中數據,能夠加where字句。性能

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,而且同時將該行的刪除操做做爲事務記錄在日誌中保存以便進行進行回滾操做。TRUNCATE TABLE 則一次性地從表中刪除全部的數據並不把單獨的刪除操做記錄記入日誌保存,刪除行是不能恢復的。而且在刪除的過程當中不會激活與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操做不會減小表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 通常而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE能夠是table和view

(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。

(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變爲:invalid。

(7) delete語句爲DML(data maintain Language),這個操做會被放到 rollback segment中,事務提交後才生效。若是有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操做當即生效,原數據不放到 rollback segment中,不能回滾

(9) 在沒有備份狀況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,若是於事務無關,用truncate便可實現。若是和事務有關,或老師想觸發trigger,仍是用delete。

(10) Truncate table 表名 速度快,並且效率高,由於:
truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:兩者均刪除表中的所有行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。TRUNCATE TABLE 經過釋放存儲表數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的全部行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置爲該列的種子。若是想保留標識計數值,請改用 DELETE。若是要刪除表定義及其數據,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。因爲 TRUNCATE TABLE 不記錄在日誌中,因此它不能激活觸發器。

索引

數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現一般使用B樹及其變種B+樹。

建立索引能夠大大提升系統的性能。

第一,經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性。

第二,能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由。

第三,能夠加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義。

第四,在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間。

第五,經過使用索引,能夠在查詢的過程當中,使用優化隱藏器,提升系統的性能。

也許會有人要問:增長索引有如此多的優勢,爲何不對錶中的每個列建立一個索引呢?由於,增長索引也有許多不利的方面。

第一,建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。

第二,索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。

第三,當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。

索引是創建在數據庫表中的某些列的上面。在建立索引的時候,應該考慮在哪些列上能夠建立索引,在哪些列上不能建立索引。通常來講,應該在這些列上建立索引:在常常須要搜索的列上,能夠加快搜索的速度;在做爲主鍵的列上,強制該列的惟一性和組織表中數據的排列結構;在常常用在鏈接的列上,這些列主要是一些外鍵,能夠加快鏈接的速度;在常常須要根據範圍進行搜索的列上建立索引,由於索引已經排序,其指定的範圍是連續的;在常常須要排序的列上建立索引,由於索引已經排序,這樣查詢能夠利用索引的排序,加快排序查詢時間;在常用在WHERE子句中的列上面建立索引,加快條件的判斷速度。

一樣,對於有些列不該該建立索引。通常來講,不該該建立索引的的這些列具備下列特色:

第一,對於那些在查詢中不多使用或者參考的列不該該建立索引。這是由於,既然這些列不多使用到,所以有索引或者無索引,並不能提升查詢速度。相反,因爲增長了索引,反而下降了系統的維護速度和增大了空間需求。

第二,對於那些只有不多數據值的列也不該該增長索引。這是由於,因爲這些列的取值不多,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即須要在表中搜索的數據行的比例很大。增長索引,並不能明顯加快檢索速度。

第三,對於那些定義爲text, image和bit數據類型的列不該該增長索引。這是由於,這些列的數據量要麼至關大,要麼取值不多。

第四,當修改性能遠遠大於檢索性能時,不該該建立索引。這是由於,修改性能和檢索性能是互相矛盾的。當增長索引時,會提升檢索性能,可是會下降修改性能。當減小索引時,會提升修改性能,下降檢索性能。所以,當修改性能遠遠大於檢索性能時,不該該建立索引。

根據數據庫的功能,能夠在數據庫設計器中建立三種索引:惟一索引、主鍵索引和彙集索引。

惟一索引

惟一索引是不容許其中任何兩行具備相同索引值的索引。

當現有數據中存在重複的鍵值時,大多數數據庫不容許將新建立的惟一索引與表一塊兒保存。數據庫還可能防止添加將在表中建立重複鍵值的新數據。例如,若是在employee表中職員的姓(lname)上建立了惟一索引,則任何兩個員工都不能同姓。 主鍵索引 數據庫表常常有一列或列組合,其值惟一標識表中的每一行。該列稱爲表的主鍵。 在數據庫關係圖中爲表定義主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特定類型。該索引要求主鍵中的每一個值都惟一。當在查詢中使用主鍵索引時,它還容許對數據的快速訪問。 彙集索引 在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引。

若是某索引不是彙集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非彙集索引相比,彙集索引一般提供更快的數據訪問速度。

相關文章
相關標籤/搜索