mysql innodb学习笔记
一、復(fù)制表:
1、CREATE TABLE A LIKE B
此種方式在將表B復(fù)制到A時候會將表B完整的字段結(jié)構(gòu)和索引復(fù)制到表A中來。
2、CREATE?TABLE?A?AS?SELECT?x,x,x,xx?FROM?B?LIMIT?0
此種方式只會將表B的字段結(jié)構(gòu)復(fù)制到表A中來,但不會復(fù)制表B中的索引到表A中來。
這種方式比較靈活可以在復(fù)制原表表結(jié)構(gòu)的同時指定要復(fù)制哪些字段,并且自身復(fù)制表也可以根據(jù)需要增加字段結(jié)構(gòu)。
兩種方式在復(fù)制表的時候均不會復(fù)制權(quán)限對表的設(shè)置。比如說原本對表B做了權(quán)限設(shè)置,復(fù)制后,表A不具備類似于表B的權(quán)限。
二、復(fù)制表記錄:
1、create table a as select * from b
舉例:
mysql> desc test;
+------------+---------------------+------+-----+---------+-------+
| Field????? | Type??????????????? | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+-------+
| TABLE_NAME | varchar(64)???????? | NO?? |???? |???????? |?????? |
| ENGINE???? | varchar(64)???????? | YES? |???? | NULL??? |?????? |
| VERSION??? | bigint(21) unsigned | YES? |???? | NULL??? |?????? |
+------------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> create table test1 as select * from test;? ?
Query OK, 3604480 rows affected (6.04 sec)
Records: 3604480? Duplicates: 0? Warnings: 0
2、insert into table a select * from b
舉例:
mysql> desc test;
+------------+---------------------+------+-----+---------+-------+
| Field????? | Type??????????????? | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+-------+
| TABLE_NAME | varchar(64)???????? | NO?? |???? |???????? |?????? |
| ENGINE???? | varchar(64)???????? | YES? |???? | NULL??? |?????? |
| VERSION??? | bigint(21) unsigned | YES? |???? | NULL??? |?????? |
+------------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into test select * from test;
Query OK, 1802240 rows affected (16.99 sec)
Records: 1802240? Duplicates: 0? Warnings: 0
其中1使用方法為DDL,而2為DML,在復(fù)制大表記錄時1效率要高于2,
原理分析:create table as是ddl語句,insert into select是dml語句,insert into select每一條記錄的時候都會產(chǎn)生undo和redo,整個過程相比create table as產(chǎn)生的redo和undo相當(dāng)多,因此整個過程會慢也是正常的;但是create table as使用的前提是目標(biāo)表的結(jié)構(gòu)不存在才能使用;
當(dāng)有大量數(shù)據(jù)的時候不推薦使用Insert into as,因為該語句的插入的效率很慢;
三、InnoDB配置
??? InnoDB存儲引擎是默認地被允許的。如果你不想用InnoDB表,你可以添加skip-innodb選項到MySQL選項文件。
??? 被InnoDB存儲引擎管理的兩個重要的基于磁盤的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件。
??? 如果你指定無InnoDB配置選項,MySQL將在MySQL數(shù)據(jù)目錄下創(chuàng)建一個名為ibdata1的10MB大小的自動擴展數(shù)據(jù)文件,以及兩個名為ib_logfile0和ib_logfile1的5MB大小的日志文件。
???
??? 要建立InnoDB表空間文件,在my.cnf選項文件里的[mysqld]節(jié)里使用innodb_data_file_path選項。在Windows上,你可以替代地使用my.ini文件。innodb_data_file_path的值應(yīng)該為一個或多個數(shù)據(jù)文件規(guī)格的列表。
??? 如果你命名一個以上的數(shù)據(jù)文件,用分號(‘;’)分隔它們:
?????? innodb_data_file_path=datafile_spec1[;datafile_spec2]...
??? 例如:把明確創(chuàng)建的具有相同特征的表空間作為默認設(shè)置的設(shè)置操作如下:
?????? [mysqld]innodb_data_file_path=ibdata1:10M:autoextend這個設(shè)置配置一個可擴展大小的尺寸為10MB的單獨文件,名為ibdata1。沒有給出文件的位置,所以默認的是在MySQL的數(shù)據(jù)目錄內(nèi)。
??? 尺寸大小用M或者G后綴來指定說明單位是MB或者GB。
??? 一個表空間,它在數(shù)據(jù)目錄里包含一個名為ibdata1的固定尺寸50MB的數(shù)據(jù)文件和一個名為ibdata2大小為50MB的自動擴展文件,其可以像這樣被配置:
?????? [mysqld]innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
一個指定數(shù)據(jù)文件的完全后綴包括文件名,它的尺寸和數(shù)個可選屬性:
?????? file_name:file_size[:autoextend[:max:max_file_size]]autoextend屬性和后面跟著的屬性只可被用來對innodb_data_file_path行里最后一個數(shù)據(jù)文件。
??? 如果你對最后的數(shù)據(jù)文件指定autoextend選項。如果數(shù)據(jù)文件耗盡了表空間中的自由空間,InnoDB就擴展數(shù)據(jù)文件。擴展的幅度是每次8MB。
??? InnoDB并不感知最大文件尺寸,所以要小心文件系統(tǒng),在那上面最大的文件尺寸是2GB。要為一個自動擴展數(shù)據(jù)文件指定最大尺寸,請使用max屬性。下列配置允許ibdata1漲到極限的500MB:
?????? [mysqld]innodb_data_file_path=ibdata1:10M:autoextend:max:500M
InnoDB默認地在MySQL數(shù)據(jù)目錄創(chuàng)建表空間文件。要明確指定一個位置,請使用innodb_data_home_dir選項。比如,要使用兩個名為ibdata1和ibdata2的文件,但是要把他們創(chuàng)建到/ibdata,像如下一樣配置InnoDB:
[mysqld]
innodb_data_home_dir=/ibdata
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
??? 注釋:InnoDB不創(chuàng)建目錄,所以在啟動服務(wù)器之前請確認/ibdata目錄的確存在。這對你配置的任何日志文件目錄來說也是真實的。使用Unix或DOS的mkdir命令來創(chuàng)建任何必需的目錄。
??? 通過把innodb_data_home_dir的值原原本本地部署到數(shù)據(jù)文件名,并在需要的地方添加斜杠或反斜杠,InnoDB為每個數(shù)據(jù)文件形成目錄路徑。如果innodb_data_home_dir選項根本沒有在my.cnf中提到,默認值是“dot”目錄 ./,這意思是MySQL數(shù)據(jù)目錄。
??? 如果你指定innodb_data_home_dir為一個空字符串,你可以為列在innodb_data_file_path值里的數(shù)據(jù)文件指定絕對路徑。下面的例子等價于前面那個例子:
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend
??? 注意,在一些文件系統(tǒng)上,數(shù)據(jù)文件必需小于2GB。數(shù)據(jù)文件的合并尺寸必須至少10MB。
innodb日志參數(shù)如下:
| innodb_log_buffer_size??? | 1048576??? |
| innodb_log_file_size????? | 5242880??? |
| innodb_log_files_in_group | 3????????? |
| innodb_log_group_home_dir | /tmp/mysql
轉(zhuǎn)載于:https://blog.51cto.com/wushank/1641441
總結(jié)
以上是生活随笔為你收集整理的mysql innodb学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: T-SQL学习中--内联接,外连接,交叉
- 下一篇: 使用Python解析nginx日志文件