MySQL 隨筆記錄

engine=innodb和engine=myisam的區別

myisam是默認類型它是存儲記錄和文件的標準方法與其他存儲引擎比較,MyISAM具有檢查和修復表格的大多數工具. MyISAM表格可以被壓縮,而且它們支持全文搜索.它們不是事務安全的,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量 的SELECT,MyISAM是更好的選擇。

innodb這種類型是事務安全的.它與BDB類型具有相同的特性,它們還支持外鍵.InnoDB表格速度很快.具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它.如果你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表,
對於支持事物的InnoDB類型的標,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN 開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事物(即使autocommit打 開也可以),將大大提高性能。

** 常用的mysql索引方法有 B-Tree 和Hash索引

**  ***key distribution可以認爲是表的“統計信息**

它決定表做join的時候的join順序,以及在某個查詢中是否會用到某個索引
要查看key distribution,可以使用 SHOW INDEX 或者查詢 INFORMATION_SCHEMA.STATISTICS 表,兩者是一樣的
show index from table;
這個命令有助於診斷性能低下的查詢,尤其是查詢是否使用了可用的索引
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
1.Table
表的名稱。
2.Non_unique
如果索引不能包括重複詞,則爲0。如果可以,則爲1。
3.Key_name
索引的名稱。
4.Seq_in_index
索引中的列序列號,從1開始。
5.Column_name
列名稱。
6.Collation
列以什麼方式存儲在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。
7.Cardinality
索引中唯一值的數目的估計值。通過運行ANALYZE TABLE或myisamchk -a可以更新。基數根據被存儲爲整數的統計數據來計數,所以即使對於小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL使用該索引的機會就越大。
8.Sub_part
如果列只是被部分地編入索引,則爲被編入索引的字符的數目。如果整列被編入索引,則爲NULL。
9.Packed
指示關鍵字如何被壓縮。如果沒有被壓縮,則爲NULL。
10.Null
如果列含有NULL,則含有YES。如果沒有,則該列含有NO。
11.Index_type
用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
12.Comment
多種評註。

ANALYZE命令主要對錶做 key distribution 分析 //線上不要用 別鎖表
ANALYZE TABLE 作用的對象是 InnoDB, NDB, 和 MyISAM 表,對視圖不起作用。在分析期間,會對錶加上read lock(InnoDB, MyISAM) , 如果自從上次分析之後,表沒有發生變化,則不會被再次分析。

SHOW OPEN TABLES [FROM db_name] [LIKE 'pattern']

  SHOW OPEN TABLES列舉在表緩存中當前被打開的非TEMPORARY表。

  SHOW OPEN TABLES會返回以下字段:

  ·Database

  含有該表的數據庫。

  ·Table

  表名稱。

  ·In_use

  表當前被查詢使用的次數。如果該數爲零,則表是打開的,但是當前沒有被使用。

  ·Name_locked

  表名稱是否被鎖定。名稱鎖定用於取消表或對錶進行重命名等操作。

主鍵索引 PRIMARY 唯一的 不能爲空 一個表只能有一個 主鍵索引通常在建表的時候就指定 id
建表時指定

CREATE 表名(ID INT NOT NULL,USERNAME VARCHAR(16) NOT NULL,PRIMARY KEY(ID))
PRIMARY KEY(ID)

普通索引 NORMAL 不受限制
建表時指定
CREATE 表名(ID INT NOT NULL,USERNAME VARCHAR(16) NOT NULL,INDEX USERNAME_INDEX(USERNAME(16))) //給列USERNAME建普通索引USERNAME_INDEX

ALTER語句指定

ALTER 表名 ADD INDEX U_INDEX (USERNAME) //給列USERNAME建普通索引 U_INDEX

刪除索引

DROP INDEX U_INDEX ON 表名 //刪除表t_user中的索引U_INDEX

唯一索引 UNIQUE 唯一可允許爲空
建表時指定

CREATE 表名r(ID INT NOT NULL,USERNAME VARCHAR(16) NOT NULL,UNIQUE U_INDEX(USERNAME)) //給列USERNAME添加唯一索引T_USER

ALTER語句指定

ALTER 表名 ADD UNIQUE u_index(USERNAME) //給列T_USER添加唯一索引u_index

刪除索引

DROP INDEX U_INDEX ON 表名

全文索引 FULLTEXT 長篇文章可用 如果短篇文章 可用INDEX

char和varchar再數據庫設計的時候要明白:
char 是固定長度0-255 如果存數據的時候有空格 則會把空格存入數據表中,取數據的時候空格丟棄

varchar 是可變長度 0-65535 如果存數據的時候有空格 則會不會把空格存入數據表中,取數據的時候如果數據有空格則會保留空格


索引不足之處:

索引提高了查詢的速度,但是降低了INSERT、UPDATE、DELETE的速度,因爲在插入、修改、刪除數據時,還要同時操作一下索引文件;
佔用一定的磁盤空間
一般情況下不是鼓勵使用like,如果非使用,那麼需要注意 like"%aaa%"不會使用索引;但like“aaa%”會使用索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章