1. 程式人生 > >mysql索引優化 mysiam和innodb區別?

mysql索引優化 mysiam和innodb區別?

Mysql中有哪幾種鎖?

1.表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。

2.行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。

3.頁面鎖:開銷和加鎖時尚界於表鎖和行鎖之間,併發度一般。

 

mysql中有哪些不同的表格? 5種

myisam、Heap、merge、innodb、isam

 

 

MYISAM和Innodb區別

myisam表引擎:

1.  5.1版本前,myisam是預設的儲存引擎。

2. 支援全文索引,壓縮空間函式。

3.不支援事務,但是每次查詢都是原子的;不支援行鎖,不支援外來鍵,不支援崩潰後的安全恢復;

4.支援表鎖,即每次操作是對整個表加鎖;

5.每個MyISAM在磁碟上儲存成三個檔案。第一個檔案的名字以表的名字開始,副檔名指出檔案型別。.frm檔案儲存表定義。資料檔案的副檔名為.MYD (MYData)。索引檔案的副檔名是.MYI (MYIndex)。

6.使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的資料。也可以通過lock table命令來鎖表,這樣操作主要是可以模仿事務,但是消耗非常大,一般只在實驗演示中使用。

7.儲存表的總行數;

8.採用非聚集索引,索引檔案的資料域儲存指向資料檔案的指標。副索引與主索引基本一致,但是副索引不用保證唯一性。

 

Innodb表引擎:

1.預設事務引擎,最重要最廣泛的儲存引擎,效能非常優秀;

2.支援ACID的事務,支援事務的四種隔離級別;

3.支援行鎖以及外來鍵約束,因此可以支援寫併發,採用MVCC多版本控制,來支援高併發;

4.不儲存總行數;

5.所有的表都儲存在同一個資料檔案中(也可能是多個檔案,或者是獨立的表空間檔案),InnoDB表的大小隻受限於作業系統檔案的大小,一般為2GB。

5.一個innodb引擎儲存在一個檔案空間(共享空間,表大小不受作業系統控制,一個表可以分佈在多個檔案裡),也有可能為多個(設定為獨立表空間,表大小受作業系統檔案大小限制,一般為2G),受作業系統檔案大小的限制。可以配置檔案分開。

6.對主鍵查詢的效能高於其他型別的儲存引擎;主鍵索引採用聚簇索引(索引的資料域儲存資料檔案本身),副索引的資料域儲存主鍵的值;因此從副索引查詢資料,需要先通過副索引找到主鍵值,再訪問副索引;最好使用自增主鍵,防止插入資料時,為維持B+樹結構,檔案的大調整。

7.內部做了很多優化,從磁碟讀取資料時自動在記憶體構建hash索引,插入資料時自動構建插入緩衝區。

8.通過一些機制和工具支援真正的熱備份。

9.支援崩潰後的安全恢復。

10.不支援全文索引;innodb聚簇索引比myisam非聚簇索引 快。

 

mysql中Innodb支援的四種事務隔離級別名稱,以及逐級之間的區別?

sql標準定義的四個隔離級別:

1. read uncommited 讀到未提交資料

2. read committed 髒讀 ,不可重複讀

3. repeatable read 可重複讀 預設

4. serializable 序列事務

 

char 和 varchar的區別?

1.char 和 varchar 型別在儲存和檢索方面有所不同。

2.char列長度固定為建立表時宣告的長度,長度值範圍是1到255. (定長,根據定義的字串長度分配足夠的空間)

3.當char值被儲存時,它們被用空格填充到特定長度,檢索char值時需刪除尾隨空格。

4.適合儲存很短的字串,或者所有值都接近同一個長度。

5.char長度 超出設定的長度會被截斷。

6.對於經常變更的資料,char比varchar更好,char不容易產生碎片。

對於非常短的列,char比varchar在儲存空間上更有效率,只分配真正需要的空間,更長的列會消耗更多的記憶體。

 

主鍵和候選鍵有什麼區別?

表格的每一行都由主鍵唯一標識,一個表只有一個主鍵。

主鍵也是候選鍵。按照慣例,候選鍵可以被指定為主鍵,並且可以用於任何外來鍵引用。

 

表格定義的所有索引?

索引是通過以下方式為表格定義的: show index from <tablename>;

 

like宣告中的 % 和 _  是什麼意思?

%對應於0個或更多字元, _  只是like語句中的一個字元。 

 

如何在unix和mysql時間戳之間進行轉換?

UNIX_TIMESTAMP是從mysql時間戳轉換為unix時間戳的命令。

FROM_UNIXTIME是從時間戳轉換為mysql時間戳的命令。

 

列對比運算子是什麼?

在SELECT語句的列比較中使用 =,<>,<=,<,>=,>,<<,>>,<=>,AND,OR或like運算子。

 

BLOB和TEXT有什麼區別?

1.儘量避免使用BLOB/text型別,查詢會使用臨時表,導致嚴重的效能開銷。

2.BLOB是一個二進位制物件,可以容納可變數量的資料。 TEXT是一個不區分大小寫的BLOB。

3.BLOB和TEXT型別之間的唯一區別在於對BLOB值進行排序和比較時,區分大小寫,對TEXT值不區分大小寫。

 

mysql_fetch_array 和 mysql_fetch_object 和 mysql_fetch_rows的區別是什麼?

mysql_fetch_array()  將結果行作為關聯資料或來自資料庫的常規資料返回。

mysql_fetch_objetc()  從資料庫返回結果行作為物件。

 

mysql 如何優化DISTINCT?  distinct

distinct在所有列上轉換為group by,並與order by子句結合使用。

 

可以使用多少列建立索引?

最多可以建立16個索引列。

 

如果一個表有一列定義為TIMESTAMP,將發生什麼?

每當行被更改時,時間戳欄位將獲取當前時間戳。

 

列設定為AUTO_INCREMENT時,如果在表中達到最大值,會發生什麼情況?

會停止遞增,任何進一步的插入都將產生錯誤,因為金鑰已被使用。

 

怎樣才能找出最後一次插入時分配了哪個自動增量?

LAST_INSERT_ID將返回由AUTO_INCREMENT分配的最後一個值,並且不需要指定表名稱。

 

NOW() 和 CURRENT_DATE() 由什麼區別?

NOW()命令用於顯示當前年份,月份,日期,小時,分鐘和秒。

CURRENT_DATE() 僅顯示當前年份,月份和日期。

 

什麼是非標準字串型別?

1.TINYTEXT

2.TEXT

3.MEDIUMTEXT

4.LONGTEXT

 

什麼是通用SQL函式?

1.CONCATAT(A,B)  連線兩個字串值以建立單個字串輸出。通常用於將兩個或多個欄位合併為一個欄位。

2.FORMAT(X,D)  格式化數字X到D有效數字。

3.CURRDATE(), CURRTIME()  返回當前日期或時間

4.NOW()  將當前日期和時間作為一個值返回。

5.MONTH(), DAY(), YEAR(), WEEK(), WEEKDAY()  從日期值中提取給定資料。

6.HOUR(), MINUTE(), SECOND()   從時間值中提取給定資料。

7.DATEDIFF(A,B)  確定兩個日期之間的差異,通常用於計算年齡。

8.SUBTIMES(A,B)   確定兩次之間的差異。

9.FEOMDAYS(INT)   將整數天數轉換為日期值。

 

mysql支援事務嗎?

在預設模式下,mysql是autocommit模式的,所有的資料庫更新操作都會及時提交,所以在預設情況下,mysql是不支援事務的。

但是如果你的mysql表型別是使用innodb tables 或BDB tables的話,你的mysql就可以使用事務處理,使用set autocommit模式,在非autocommit模式下,你必須使用commit來提交你的更改,或者用rollback來回滾你的更改。

 

mysql裡記錄貨幣用什麼欄位型別好?

NUMERIC和DECIMAL型別被mysql實現為同樣的型別,這在SQL92標準允許。他們被用於儲存值,該值的準確精度是極其重要的值,

例如與金錢有關資料。當宣告一個類是這些型別之一時,精度和規模的能被(並且通常是)指定。

例如:salary  decimal(9,2);

在這個例子中,9(precision)代表將被用於儲存值的總得小數位數,而2(scale)代表將被用於儲存小數點後的位數。

因此,在這種情況下,能被儲存在salary列中的值得範圍是從-9999999.99到9999999.99.

 

mysql有關許可權的表有哪幾個?

mysql伺服器通過許可權表來控制使用者對資料庫的訪問,許可權表存放在mysql資料庫裡,由mysql_install_db指令碼初始化。這些許可權表分別user,db,table_priv,columns_priv和host。

 

列的字串型別可以是什麼?

set    blob  enum   char   text

mysql資料庫做釋出系統的儲存,資料量增大的情況,怎麼優化?

1.設計良好的資料庫結構,允許部分資料冗餘,儘量避免join查詢,提高效率。

2.選擇合適的表字段資料型別和儲存引擎,適當的新增索引。

3.mysql庫主從讀寫分離。

4.找規律分表,減少單表中的資料量提高查詢速度。

5.新增快取機制,比如memcached,apc等。

6.不經常改動的頁面,生成靜態頁面。

7.書寫高效率的sql.

 

鎖的優化策略:

1.讀寫分離

2.分段加鎖

3.減少鎖持有的時間

4.多個執行緒儘量以相同的順序去獲取資源。

不能將鎖的粒度過於細化,不然可能會出現執行緒的加鎖和釋放次數過多,反而效率不如一次加一把大鎖。

 

索引的底層實現原理和優化:

B+樹    經過優化的B+樹

主要是在所有的葉子結點中增加了指向下一個葉子節點的指標,因此innodb 建議為大部分表使用預設自增的主鍵作為主索引。

 

什麼情況下設定了索引但無法使用:

1.以 % 開頭的like語句,模糊匹配; int 型別 like 不匹配。

2. or語句前後沒有同時使用索引。

3.資料型別出現隱士轉化(如varchar不加單引號的話可能會自動轉換為int型)。

4.不等於 或 not  null 

 

實踐中如何優化mysql:

1.sql 語句以及索引的優化。

2.資料庫表結構的優化。

3.系統配置的優化。

4.硬體的優化。

 

優化資料庫的方法:

1.選取最適用的欄位屬性,儘可能減少定義欄位寬度,儘量把欄位設定not null,例如 省份、性別 最好適應enum.

2.使用連線join來代替子查詢。

3.適用聯合union來代替手動建立的臨時表

4.事務處理

5.鎖定表、優化事務處理

6.使用外來鍵,優化鎖定表

7.建立索引。

8.優化查詢語句

 

簡單描述mysql中,索引 ,主鍵,唯一索引,聯合索引的區別,對資料庫的效能有什麼影響(從讀寫兩方面)?

索引是一種特殊的檔案(innodb資料表上的索引是表空間的一個組成部分),它們包含著對資料表裡所有記錄的引用指標。

普通索引(由關鍵字key或index定義的索引)的唯一任務是加快對資料的訪問速度。

 

普通索引允許被索引的資料列包含重複的值,如果能確定某個資料列將只包含彼此各不相同的值,在為這個資料列建立索引的時候就應該用關鍵字unique把它定義為一個唯一索引。也就是說,唯一索引可以保證資料記錄的唯一性。

 

主鍵:是一種特殊的唯一索引,在一張表中只能定義一個主鍵索引,主鍵用於唯一標識一條記錄,使用關鍵字primary key來建立。

 

索引可以覆蓋多個數據列,如像index(columnA,columnB)索引,這就是聯合索引。

 

索引可以極大的提高資料的查詢速度,但是會降低插入、刪除、更新表的速度,因為在執行這些寫操作時,還要操作索引檔案。

 

資料庫中的事務是什麼?

事務(transaction)是作為一個單元的一組有序的資料庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,事務則提交,其修改將作用於所有其他資料庫程序。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。

 

事務特性:

1.原子性:即不可分割性,事務要麼全部被執行,要麼就全部不被執行。

2.一致性或可序列:事務的執行使得資料庫從一種正確狀態轉換成另一種正確狀態。

3.隔離性:在事務正確提交之前,不允許把該事務對資料的任何改變提供任何其他事務。

4.永續性:事務正確提交後,其結果將永久儲存在資料庫中,即使在事務提交後有了其他故障,事務的處理結果也會得到儲存。

事務就是被繫結在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那麼整個操作就被失敗,以後操作就會回滾到操作前狀態,