mysql 總結一 * 區別 索引 視圖 存儲

Mysql中有哪幾種鎖?html

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

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

3.頁面鎖:開銷和加鎖時尚界於表鎖和行鎖之間,併發度通常。數據庫

 

mysql中有哪些不一樣的表格? 5種緩存

myisam、Heap、merge、innodb、isam安全

 

 

MYISAM和Innodb區別服務器

myisam表引擎:併發

1.  5.1版本前,myisam是默認的存儲引擎。memcached

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語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性、一致性、隔離性、持久性。

 

SQL注入漏洞產生的緣由?如何防止?

緣由:程序開發過程當中不注意規範書寫sql語句和對特殊字符進行過濾,致使客戶端能夠經過全局變量POST和GET提交一些sql語句正常執行。

防止:開啓配置文件中的magic_quotes_gpc和magic_quotes_runtime設置。

執行sql語句時使用addslashes進行sql語句轉換。sql語句書寫儘可能不要省略雙引號和單引號。

過濾掉sql語句中的一些關鍵詞:update、select、insert、delete、*.

提升數據庫表和字段的命名技巧,對一些重複的字段類型程序的特色命名,取不易被猜到的。

爲表中字段選擇合適的數據類型

優先級:int >date,time>enum,char>varchar>blob,text

優先考慮數字類型,其次是日期或二進制類型,最後是字符串類型。同級別得數據類型,應優先選擇佔用空間小的數據類型。

 

存儲時期

datatime : 以 YYYY-MM-DD HH:MM:SS 格式存儲日期時間,精確到秒,佔用8個字節的存儲空間;存儲於時區無關。

timestamp:以時間戳格式存儲,佔用4個字節,範圍小1970-1-1到2038-1-19,顯示依賴於所指定的時區,默認在第一列行的數據修改時能夠自動得修改timestamp列得值。

date:(生日)佔用的字節數比使用字符串、datatime、int存儲要少,使用date只須要3個字節,存儲日期月份,還能夠利用日期時間函數進行日期得計算。

time:存儲時間部分的數據

注意:不要使用字符串類型來存儲日期時間數據(一般比字符串佔用的存儲空間小,在進行查找過濾能夠利用日期函數)

使用int存儲日期時間不如使用timestamp類型

 

對於關係型數據庫而言,索引是至關重要的。回答有關索引的幾個問題?

1.索引的目的是什麼?

快速訪問數據表中的特定數據,提升查詢速度;下降寫操做速度,佔用磁盤空間。(減小服務器須要掃描的數據量)

幫助服務器避免排序和臨時表;

將隨機I/O 變爲順序I/O;

建立惟一索引,保證數據庫表中每一行數據的惟一性。能夠爲NULL。 (不能not null,不能有默認值)

加速表和表之間的鏈接。

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

2.索引對數據庫系統的負面影響是什麼?

負面:

 建立索引和維護索引須要耗費時間,這個時間隨着數據量的增長而增長;索引須要佔用物理空間,不光是表須要佔用數據空間,每一個索引也須要佔用物理空間;

當對錶進行增刪改查的時候,索引也要動態維護,這樣就下降了數據的維護速度。

3.爲數據表創建索引的原則有哪些?

在最頻繁使用的、用以縮小查詢範圍的字段上創建索引。where 條件 或 on 關聯表查詢的 關聯列

在頻繁使用的。須要排序的字段上創建索引。

4.什麼狀況下不宜創建索引?

對於查詢中不多涉及的列或重複值比較多的列,不宜創建索引。

對於一些特殊的數據類型,不宜創建索引,好比文本字段(text)等。

 

解釋mysql外連接、內鏈接與自鏈接的區別?

交叉鏈接:又叫笛卡爾積,它是指不使用任何條件,直接將一個表的全部記錄和另外一個表中的全部記錄一一匹配。

內鏈接:是隻有條件的交叉鏈接,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出如今結果集中,即內鏈接只鏈接匹配的行。

外連接:其結果集中不包含符合鏈接條件的行,並且會包括左表、右表或兩個表的全部數據行,這三種狀況依次稱爲左外鏈接、右外鏈接和全外鏈接。

左外鏈接:也稱左鏈接,左表爲主表,左表中的全部記錄都會出如今結果集中,對於那些在右表中並無匹配的記錄,扔顯示,右表對應的那些字段值以NULL來填充。

右外鏈接:也稱右鏈接,右表爲主表。與左鏈接相反。mysql目前不支持全外鏈接。

 

mysql中事務回滾機制概述?

事務是用戶定義的一個數據庫操做序列,這些操做要麼全作要麼所有不作,是一個不可分割的工做單位,事務回滾是指將該事務已經完成的對數據庫的更新操做撤銷。

 

要同時修改數據庫中兩個不一樣表時,若是他們不是一個事務的話,當第一個表修改完,可能第二個表修改過程當中出現了異常而沒能修改,此時就只有第二個表依舊是未修改以前的狀態,而第一個表已經被修改完畢。而當你把它們設定爲一個事務的時候,當第一個表修改完,第二個表修改出現異常而沒有被修改,第一個表和第二個表都要回到未修改的狀態,這就是所謂的事務回滾。

 

SQL語言包含哪幾部分?每部分都有哪些操做關鍵字?

sql語言包括數據定義(DDL)、數據操縱(DML),數據控制(DCL)和數據查詢(DQL)四個部分。

數據定義:CREATE TABLE,ALTER TABLE,DROP TABLE,CREATE/DROP INDEX.

數據操縱:select insert  update delete

數據控制:grant  revoke

數據查詢:select

 

完整性約束包括哪些?

數據完整性(data integrity)是指數據的精確(accuracy)和可靠性(reliability)。

分爲如下四類:

1》實體完整性:規定表的每一行在表中是惟一的實體。

2》域完整性:是指表中的列必須知足某種特定的數據類型約束,其中約束又包括取值範圍、精度等規定。

3》參照完整性:是指兩個表的主關鍵字和外關鍵字的數據應一致,保證了表之間的數據的一致性,防止了數據丟失或無心義的數據在數據庫中擴散。

4》用戶定義的完整性:不用的關係數據庫系統根據其應用環境的不一樣,每每還須要一些特殊的約束條件。用戶定義的完整性便是針對某個特定關係數據庫的約束條件,他反應某一具體應用必須知足的語義要求。

與表有關的約束:包括列約束(not null 非空約束)和表約束(primary key、foreign key、check、unique)

什麼是鎖?

數據庫是一個多用戶使用的共享資源。當多個用戶併發的存取數據時,在數據庫中就會產生多個事務同時存取同一數據的狀況。若對併發操做不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。

加鎖是實現數據庫併發控制的一個很是重要的技術。當事務在對某個數據對象進行操做前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了必定的控制,在該事務釋放鎖以前,其餘的事務不能對此數據對象進行更新操做。

 

基本鎖類型:鎖包括行級鎖和表級鎖。

什麼叫視圖?遊標是什麼?

視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增改查操做,視圖一般是有一個表或多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。

遊標:是對查詢處來的結果做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。

什麼是存儲過程?用什麼來調用?

存儲過程是一個預編譯的sql語句,有點事容許模塊化設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次sql,使用存儲過程比單純sql語句執行要快。能夠用一個命令對象來調用存儲過程。

 

如何通俗的理解三個範式?

第一範式:對屬性的原子性約束,要求屬性具備原子性,不可再分解;

第二範式:對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;

第三範式:對字段冗餘性的約束,即任何字段不能由其餘字段派生出來,它要求字段沒有冗餘 。

 

範式設計優缺點:

優勢:能夠儘可能的減小數據冗餘,使得更新快,體積小

缺點:對於查詢須要多個表進行關聯,減小寫的效率,增長讀的效率,更難進行索引優化。

 

反範式化:

優勢:能夠減小表的關聯,能夠更好的進行索引優化。

缺點:數據冗餘以及數據異常,數據得修改須要更多的成本。

什麼是基本表?什麼是視圖?

基本表是自己獨立存在的表,在sql中一個關係對應一個表。視圖是從一個或幾個基本表處處的表。視圖自己不獨立存儲在數據庫中,是一個虛表。

試述視圖的優勢?

1.視圖可以簡化用戶的操做。

2.視圖使用戶能以多種角度看待同一數據。

3.視圖爲數據庫提供了必定程度的邏輯獨立性。

4.視圖可以對機密數據提供安全保護。

 

NULL是什麼意思?

NULL這個值表示UNKNOWN(未知),它不表示「」(空字符串)。對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個NULL值進行比較,並在邏輯上但願得到一個答案。

使用IS NULL來進行NULL判斷。

 

主鍵、外鍵和索引的區別?

主鍵  :惟一標識一條記錄,不能有重複的,不容許爲空。

外鍵:表的外鍵是另外一表的主鍵,外鍵能夠有重複的,能夠是空值。

索引:該字段沒有重複值,但能夠有一個空值。

做用:

主鍵:用來保證數據完整性。

外鍵:用來和其餘表創建聯繫用的。

索引:提升查詢排序的速度。

個數:

主鍵 :主鍵一個表只有一個

外鍵:一個表能夠有多個外鍵

索引:一個表能夠有多個惟一索引

 

你能夠用什麼來確保表格裏的字段只接受特定範圍的值?

check限制,它在數據庫表格裏被定義,用來限制輸入該列的值。

觸發器也能夠被用來限制數據庫表格裏的字段可以接受的值,可是這種辦法要求觸發器在表格裏被定義,這可能會在某些狀況下影響到性能。

 

說說對SQL語句優化有哪些方法?

1.where子句中:where表之間的鏈接必須寫在其餘where條件以前,那些能夠過濾掉最大數據記錄的條件必須寫在where子句的末尾,having最後。

2.用exists替代in 、用not exists 替代not in.

3.避免在索引列上使用計算。

4.避免在索引列上使用is null 和is not null

5.對查詢進行優化,應儘可能避免全表掃描,首先應考慮在where以及order by 涉及的列上創建索引。

6.應儘可能避免在where子句中對字段進行null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描。

7.應儘可能避免在where子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描。

 

複合索引的優勢和注意事項

 

概念:
    單一索引是指索引列爲一列的狀況,即新建索引的語句只實施在一列上;
    用戶能夠在多個列上創建索引,這種索引叫作複合索引(組合索引);
    複合索引在數據庫操做期間所需的開銷更小,能夠代替多個單一索引;
    同時有兩個概念叫作窄索引和寬索引,窄索引是指索引列爲1-2列的索引,寬索引也就是索引列超過2列的索引;
    設計索引的一個重要原則就是能用窄索引不用寬索引,由於窄索引每每比組合索引更有效;

使用:
    建立索引
    create index idx1 on table1(col1,col2,col3)
    查詢
    select * from table1 where col1= A and col2= B and col3 = C
    這時候查詢優化器,不在掃描表了,而是直接的從索引中拿數據,由於索引中有這些數據,這叫覆蓋式查詢,這樣的查詢速度很是快;

注意事項:
    一、對於複合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效率最高;
    select * from table1 where col1=A AND col2=B AND col3=D
    若是使用 where col2=B AND col1=A 或者 where col2=B 將不會使用索引

    二、什麼時候是用複合索引
    根據where條件建索引是極其重要的一個原則;
    注意不要過多用索引,不然對錶更新的效率有很大的影響,由於在操做表的時候要化大量時間花在建立索引中

    三、複合索引會替代單一索引麼
    若是索引知足窄索引的狀況下能夠創建複合索引,這樣能夠節約空間和時間


備註:
    對一張表來講,若是有一個複合索引 on (col1,col2),就沒有必要同時創建一個單索引 on col1;
    若是查詢條件須要,能夠在已有單索引 on col1的狀況下,添加複合索引on (col1,col2),對於效率有必定的提升
    同時創建多字段(包含五、6個字段)的複合索引沒有特別多的好處,相對而言,創建多個窄字段(僅包含一個,或頂多2個字段)的索引能夠達到更好的效率和靈活性。

 

 

表引擎  字符集

表字段 名稱 類型 長度 字符集 默認值 註釋 

一、        剔除關係不密切的字段

二、        字段命名要有規則及相對應的含義(不要一部分英文,一部分拼音,還有相似a.b.c這樣不明含義的字段)

三、        字段命名儘可能不要使用縮寫(大多數縮寫都不能明確字段含義)

四、        字段不要大小寫混用(想要具備可讀性,多個英文單詞可以使用下劃線形式鏈接)

五、        字段名不要使用保留字或者關鍵字

六、        保持字段名和類型的一致性

七、        慎重選擇數字類型

八、        給文本字段留足餘量

  表結構合理性配置

一、        多型字段的處理

就是表中是否存在字段可以分解成更小獨立的幾部分(例如:人能夠分爲男人和女人)

二、        多值字段的處理

能夠將表分爲三張表

這樣使得檢索和排序更加有調理,且保證數據的完整性!

其它建議

一、        對於大數據字段,獨立表進行存儲,以便影響性能(例如:簡介字段)

二、        使用varchar類型代替char,由於varchar會動態分配長度,char指定長度是固定的。

三、        給表建立主鍵,對於沒有主鍵的表,在查詢和索引定義上有必定的影響。

四、        避免表字段運行爲null,建議設置默認值(例如:int類型設置默認值爲0)在索引查詢上,效率立顯!

五、        創建索引,最好創建在惟一和非空的字段上,創建太多的索引對後期插入、更新都存在必定的影響(考慮實際狀況來建立)。

CREATE TABLE `user` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `username` char(30) NOT NULL DEFAULT '' COMMENT '用戶名',  `realname` char(30) NOT NULL DEFAULT '' COMMENT '真實姓名',  `idcard` char(50) NOT NULL DEFAULT '' COMMENT '身份證號碼',  `mobile` char(15) NOT NULL DEFAULT '' COMMENT '手機號',  `level` char(5) DEFAULT '' COMMENT '證書等級 s1-s8',  `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '認證狀態 1未認證 2 已認證',  `operate_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '操做人id',  `create_time` int(10) unsigned DEFAULT '0' COMMENT '建立時間',  `update_time` int(10) unsigned DEFAULT '0' COMMENT '修改時間',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';

相關文章
相關標籤/搜索