輸入show engines;mysql
mysql>show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.00 sec)
或者輸入show variables like 'have%';sql
mysql> show variables like 'have%'; +------------------------+----------+ | Variable_name | Value | +------------------------+----------+ | have_compress | YES | | have_crypt | NO | | have_dynamic_loading | YES | | have_geometry | YES | | have_openssl | DISABLED | | have_profiling | YES | | have_query_cache | YES | | have_rtree_keys | YES | | have_ssl | DISABLED | | have_statement_timeout | YES | | have_symlink | YES | +------------------------+----------+ 11 rows in set, 1 warning (0.00 sec)
通常來講MySQL默認存儲引擎爲InnoDB。segmentfault
MySQL5.5版本以前默認存儲引擎爲MyISAM,5.5以後改成了InnoDB。app
mysql>show variables like 'engine%'; +----------------------------------+--------+ | Variable_name | Value | +----------------------------------+--------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_disk_storage_engine | InnoDB | +----------------------------------+--------+ 4 rows in set, 1 warning (0.00 sec)
修改默認引擎有兩種方式,一種爲經過圖形化界面修改,一種爲修改配置文件。socket
(1). 經過圖形化界面修改(軟件爲mysql workbench)ide
(2). 修改配置文件性能
打開my.ini配置文件(若是是默認安裝的話,在C:ProgramDataMySQLMySQL Server 5.7目錄下),修改如下信息:測試
[mysqld] # The next three options are mutually exclusive to SERVER_PORT below. # skip-networking # enable-named-pipe # shared-memory # shared-memory-base-name=MYSQL # The Pipe the MySQL Server will use # socket=MYSQL # The TCP/IP Port the MySQL Server will listen on port=3306 # Path to installation directory. All paths are usually resolved relative to this. basedir="C:/Program Files/MySQL/MySQL Server 5.7/" # Path to the database root datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data/ # The default character set that will be used when a new schema or table is # created and no character set is defined character-set-server=utf8 # 在這裏修改默認存儲引擎! # The default storage engine that will be used when create new tables when default-storage-engine=INNODB
以上兩種方法修改存儲引擎以後,須要重啓MySQL使配置生效!優化
各類存儲引擎比較:this
mysql中有許多的數據類型,以下表:
類型 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 字節 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 字節 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 字節 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 字節 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 字節 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 字節 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度/浮點數值 |
DOUBLE | 8 字節 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度/浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,若是M>D,爲M+2不然爲D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
類型 | 大小(字節) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2037 年某時 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字節 | 定長字符串 |
VARCHAR | 0-65535 字節 | 變長字符串 |
TINYBLOB | 0-255字節 | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255字節 | 短文本字符串 |
BLOB | 0-65 535字節 | 二進制形式的長文本數據 |
TEXT | 0-65 535字節 | 長文本數據 |
MEDIUMBLOB | 0-16 777 215字節 | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215字節 | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295字節 | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295字節 | 極大文本數據 |
char:固定長度字符類型
varchar:可變長度字符類型
char和varchar的一個區別就是檢索時char刪除了尾部的空格,因此char須要程序處理尾部空格的問題。以下代碼:
mysql> create table vc( -> v varchar(4), -> c char(4)); Query OK, 0 rows affected (0.03 sec) mysql> insert into vc values('ab ','ab '); Query OK, 1 row affected (0.02 sec) mysql> select concat(v, '+'),concat(c, '+') from vc; +----------------+----------------+ | concat(v, '+') | concat(c, '+') | +----------------+----------------+ | ab + | ab+ | +----------------+----------------+ 1 row in set (0.00 sec)
不一樣的存儲引擎對char和varchar的支持和使用原則也不一致,以下:
存儲引擎 | 使用原則 |
---|---|
MyISAM | 建議使用固定長度的數據列代替可變長度的數據列 |
MEMORY | 目前都使用固定長度的數據行存儲,char和varchar沒有太大區別,二者都做爲char處理 |
InnoDB | 建議使用varcahr,由於InnoDB數據表內部的行存儲格式沒有區分固定長度和可變長度列,主要的影響因素爲數據行使用的存儲總量,因爲varchar平均佔用空間更小,有利於最小化數據行存儲總量來減小磁盤I/O讀取的時間 |
text和blob都是用於保存較大文本數據,不過blob能夠保存二進制數據(如照片,音頻)
,而text只能保存字符數據(如文章、日記)。
blob和text值會引發一些性能問題,特別是當你執行了大量刪除操做的時候,會在數據表中留下大量的「空洞」。建議按期使用optimize table
對錶進行碎片整理,避免「空洞」形成的性能問題。
下面是一個測試碎片整理
optimize table
命令功能的例子
mysql> create table t(id varchar(100), context text); Query OK, 0 rows affected (0.01 sec) mysql> insert into t values(1,repeat('hello',1000)); Query OK, 1 row affected (0.00 sec) mysql> insert into t values(2,repeat('hello',1000)); Query OK, 1 row affected (0.02 sec) # 執行新增操做,以指數增加的方式快速增長表的數據量 mysql> insert into t select * from t; Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t select * from t; Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 # 不少步操做後... mysql> insert into t select * from t; Query OK, 256 rows affected (0.01 sec) Records: 256 Duplicates: 0 Warnings: 0
這個時候表的數據文件大小爲:
從文件中刪除id爲"1"的數據,理論上可以使表的大小減少一半,但實際操做出現的卻不是這樣的結果。
mysql> delete from t where id = 1; Query OK, 16384 rows affected (2.30 sec)
刪除一半數據後的表數據文件大小爲:
能夠發現文件大小根本沒有減少,大小仍與以前同樣,接下來對錶進行
optimize
優化操做。
mysql> optimize table t; +-------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +-------------+----------+----------+----------+ | mysqldemo.t | optimize | status | OK | +-------------+----------+----------+----------+ 2 rows in set (5.74 sec)
優化後的表數據文件大小爲:
能夠看到,表的大小已有明顯減少,「空洞」空間已經被回收。
浮點數在MySQL中用float,double來表示,若是插入數值精度超過該列定義的實際精度,則會被四捨五入到符合精度後進行插入存儲,此過程不會報錯。
而定點數其實是用字符串形式存放的,在MySQL中用decimal表示,若是實際插入的數值精度大於實際定義的精度,則MySQL會產生警告(默認的SQLMode下),但實際數據會四捨五入後插入,但若是MySQL是在tranitional(傳統模式)下,則MySQL會直接報錯,拒絕執行。
二者的數據存儲區別能夠從下面的例子看出:
mysql> create table t(c1 float(10,2), c2 decimal(10,2)); Query OK, 0 rows affected (0.06 sec) mysql> insert into t values(131072.32, 131072.32); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +-----------+-----------+ | c1 | c2 | +-----------+-----------+ | 131072.31 | 131072.32 | +-----------+-----------+ 1 row in set (0.00 sec)
浮點數的比較也是一個廣泛存在的問題。由於二進制和計算機自己的構造緣由,浮點數的表示會存在誤差,不能直接用"=="直接比較數值,而是經過二者之差小於一個特別小的數來進行比較。
例如: a - b < 0.000001