Mysql存储引擎、数据类型和字符集

表类型(存储引擎)的选择

MySQL支持的存储引擎包括MyISAM、InnoDB、BDB、MERGE、EXAMPLE、NDB、Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等其中InnoDB和BDB提供事物安全表,其他存储引擎都是非事务安全表。

查看当前的默认存储引擎

show variables like 'table_type';
SHOW ENGINES;

image-20200215185337576

在创建表的时候可以通过增加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

image-20200215201434381

选择合适的存储引擎

image-20200215202855775

InnoDB

InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全处理。

1 自动增长列
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;

image-20200215210634744

语句强制设置自动增长列的初始值,默认从1开始。

可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值,如果一次插入了多条记录,那么返回的是第一条记录使用的自动增长列。

image-20200215210723014

select LAST_INSERT_ID();
INSERT into autoincre_demo(name) VALUES('5'),('6'),('7')

image-20200215211825305

对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列。

2.外键约束
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;

image-20200215213610423

3.存储方式

image-20200215205124523

数据类型

CHAR和VARCHAR

image-20200215214005502

CREATE TABLE vc1(v VARCHAR(4), c CHAR(4));
insert into vc1 VALUES('ab  ','ab   ');
select concat(v,'+'),concat(c,'+') from vc1;

image-20200215224701226

由于CHAR是固定长度,处理速度比VARCHAR快的多,但是缺点是浪费储存空间

image-20200215225035876

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;

image-20200215234628415

如果要查询“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;

image-20200216000022563

CREATE table test(c1 float(10,2), c2 decimal(10,2));
insert into test values(131072.32,131072.32);
select * from test;

image-20200216000405273

image-20200216000521039

日期类型选择

image-20200215235521850

字符集

image-20200216120753726

show character set;

image-20200216122151309

查询当前服务器的字符集和校对规则:

show variables like 'character_set_server';

image-20200216121209691

使用新的字符集创建新的数据库:

create database databasename default charset gbk;

猜你喜欢

转载自www.cnblogs.com/zhichun/p/12316352.html