adsadadaddadasda 2020-02-16
MySQL支持的存储引擎包括MyISAM、InnoDB、BDB、MERGE、EXAMPLE、NDB、Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等其中InnoDB和BDB提供事物安全表,其他存储引擎都是非事务安全表。
查看当前的默认存储引擎
show variables like 'table_type';
SHOW ENGINES;
在创建表的时候可以通过增加ENGINE关键字设置新建表的存储引擎
CREATE TABLE ai( i bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY(i) )ENGINE=MyISAM DEFAULT CHARSET=gbk; CREATE TABLE country( country_id samllint unsigned not null auto_increment, country varchar(30) not null, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )engine=InnoDB DEFAULT CHARSET=gbk;
更改存储引擎
ALTER TABLE ai engine = INNODB show create table ai
运行结果如下,显示引擎变为InnoDB
CREATE TABLE `ai` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `bin` bit(1) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
选择合适的存储引擎
InnoDB
InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全处理。
CREATE table autoincre_demo (i smallint not null auto_increment, name varchar(10), PRIMARY key(i) )engine=innodb; insert into autoincre_demo values(1,'1'),(0,'2'),(null,'3') select * from autoincre_demo;
语句强制设置自动增长列的初始值,默认从1开始。
可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值,如果一次插入了多条记录,那么返回的是第一条记录使用的自动增长列。
select LAST_INSERT_ID();
INSERT into autoincre_demo(name) VALUES('5'),('6'),('7')
对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列。
CREATE TABLE `country` ( `country_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `country` varchar(50) NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`country_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
create table city( city_id smallint unsigned not null auto_increment, city varchar(50) not null, country_id smallint unsigned not null, last_update timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY key(city_id), key idx_fx_country_id(country_id), constraint 'fk_city_country' foreign key(country_id) references country(country_id) on DELETE restrict on update CASCADE )engine=INNODB default charset=utf8;
CHAR和VARCHAR
CREATE TABLE vc1(v VARCHAR(4), c CHAR(4)); insert into vc1 VALUES('ab ','ab '); select concat(v,'+'),concat(c,'+') from vc1;
由于CHAR是固定长度,处理速度比VARCHAR快的多,但是缺点是浪费储存空间
TEXT和BLOB
二者主要差别是BLOB能用来保存二进制数据,比如照片;而TEXT只能保存字符数据。
对表进行优化操作
insert into table1 VALUES(1,repeat('haha',20)); insert into table1 VALUES(2,repeat('haha',20)); insert into table1 VALUES(3,repeat('haha',10)); insert into table1 select * from table1; insert into table1 select * from table1; optimize table table1;
使用合成索引来提高文本字段的查询措施
create table table2(id varchar(100),context blob,hash_value varchar(40)); insert into table2 values(1,repeat('beijing',2),md5(context)); insert into table2 values(2,repeat('beijing1',2),md5(context)); insert into table2 values(3,repeat('beijing2',2),md5(context)); select * from table2;
如果要查询“beijing2 beijing2”的记录,可以通过散列值来查询。
select * from table2 where hash_value=md5(repeat('beijng1',2))
浮点数和定点数
浮点数一般用来表示含有小数部分的数值,当一个字段被定义为浮点数之后,如果插入数据的精度超过该列的实际精度,则插入值会被四舍五入到实际定义的精度值。
CREATE table table3(f float(8,1)); insert into table3 VALUES(1.23456); SELECT * from table3;
CREATE table test(c1 float(10,2), c2 decimal(10,2)); insert into test values(131072.32,131072.32); select * from test;
日期类型选择
show character set;
查询当前服务器的字符集和校对规则:
show variables like 'character_set_server';
使用新的字符集创建新的数据库:
create database databasename default charset gbk;