MySQL ---c/s架构
数据库简介:数据库是以一定方式存储在一起的数据的集合。
数据库管理系统:软件(实现存储,截取,安全保障,备份的功能。)
数据库组成:数据库-->表(映射目录)-->行记录(映射文件)-->字段列(映射文件数据)
数据库分类:
一·关系型数据库
关系型数据库建立在关系模型基础上,且使用sql语句作为查询语言
(库与库,表与表,数据与数据之间可能存在某种关系)
常见:mysql,mariaDB,SQL-server,Oracle
二·非关系型数据库
更多的非关系型数据库,是为了缓存加速,大多数工作在内存中
存储:一般都依靠键值对(key-value)
不使用sql作为查询语言的
常见: mongodb(文件导向型数据库)
redis(内存数据库,速度快持久化),
Hbase(分布式数据库,与云结合,主用于大数据处理)
《《《《《《触发器》》》》》》》
MySQL----------------------------------------------------------------
MySQL默认情况下是支持匿名登录的
本地登录
(给root设置密码)
法一:#mysqladmin -u root password "123.com"
法二:#mysql_secure_installation
登录:mysql -u root -p123.com
安全模式登录:破解root密码,停止mysql服务
安全模式跳过授权表启动mysql(#mysqld_safe --skip-grant-tables --user=mysql &)
匿名登录后修改user表
关闭安全模式(#mysqladmin shutdown 或 杀进程 ps -ef | grep mysqld --- kill -9 ‘进程号’)
重启新密码登录
mysql初始化:# mysql_install_db(一般不用)
SQL 语句
结构化查询语言,和关系型数据库通信
数据库名、表名、别名及视图名区分大小写的(因为linux是区分大小写的) 触发器区分大小写的
基本SQL 语句(查看切换show select)
DDL:Definition 数据定义语言(create drop alter truncate rollback commit)
创建库; > create database 库名; 或者 create schema 库名;
创建表: > create table 表名 (字段1 字段类型,字段2 字段类型,.....);
字段类型:int :整型 、char(10):字符 、varchar(10):可变字符
查看表结构: > desc t1;
查看建表时语句: > show create table t1G;
-----@创建表的时候,单独制定字符集
> create table t4 (id int) default charset=utf8;
删除表: > drop table 表;
修改表:alter
《1》对表字段修改
1·修改字段名称0 > alter table 表 change 旧字段名 新字段名 数据类型;
2·修改字段属性 > alter table 表 modify 字段 新属性(包括类型);
------@ 修改字符集 > alter database 库名 character set utf8;
3·添加字段 > alter table 表 add 字段 字段类型 [关键词(after 旧字段/first)];
4·删除表中字段 > alter table 表 drop 字段;
《2》对表名修改 > alter table 旧表名 rename 新表名;
截断表 :truncate
> truncate table 表 ; (不能回滚,删除数据释放空间 速度快)
《3》修改表引擎
> alter table 表 engine=innodb
****导致io问题:不建议-->数据导出改表引擎导入
DML : Manipulation 数据操纵语言 (insert delete update)
1·插入数据:insert (可加条件 where)
> insert into 表 ([字段名]) values(值);(字段名与值个数对应)
2·查看数据:> select */字段 from 表
3·删除数据:delete (可回滚 但engine=innodb)
> delete from 表 [where 字段>=值];
4·更新表中数据:update
> update 表 set 字段=新值 where 条件(确定哪行字段);
DQL : Query 数据查询语言 (select show)
SQL语句的执行顺序如下: from where (group by) having select (order by) limit
1·指定条件查询:
格式:select * from 表 where 表中字段>=值
select 用来过滤字段的
from 指定从哪些表中查询数据
where 用来过滤行的
show variables;查看变量值
2·模糊查询 :
格式: select 字段1 from 表 where 字段2 like ‘x%’
show variables like 'da%';
like '_'或'%' _:匹配单个字符 %:匹配0个或多个字符
3·分组查询 :
格式:select {显示的列} from 表 group by {以表中那列分组} [having 条件];
例子: select class,avg(score) as avg from student group by class;查询每个班的平均成绩
select class,sum(chengji) from example group by class having class="1";
4·排序查询 :
格式: order by 字段名[,字段名2,....] {asc|desc} [以哪个字段排序]
例子: select * from student order by score desc;
asc :升序,(默认)
desc :降序
5·限制输出 :
格式:limit n 只显示查询结果的前n条
limit m,n 从m+1行开始,显示n行
6·子查询 : 嵌套查询,将里层查询的结果作为外层查询的条件
格式:
例子:select class,name,shuxue from haha where class=(select tclass from hehe where tclass=1;
7·连接 :
格式:
外连接:
左连接:select * from t2 left join t3 on t2.class=t3.tid;
右连接:select * from t2 right join t3 on t2.class=t3.tid;
自然连接:select * from t2 join t3 [where t2.class=t3.tid];
内连接:获取的是两个表的公共的部分,可能造成信息的丢失
表一 inner join 表二 on 连接条件
或者:where 表一.字段名=表二.字段名
8·去重 :distinct
9·正则表达式:regexp -----> regular expression
DCL : control 数据控制语言 (grant revoke)
1·创建用户 :create user 用户名@{主机名|ip地址} identified by ‘密码’;
2·删除用户 :drop user 用户名@{主机名|IP地址};
3·远程登录 :mysql -u 用户名 -h IP地址 -p
ERROR 1042 (HY000): Can't get hostname for your address
修改配置文件:
[root@mysql mysql]# vim /etc/my.cnf
在[mysqld]那段里面添加如下行:5.6版本不需要
skip-name-resolve //跳过名字解析,否则无法远程连接该mysql管理系统
4·授权 (创建用户):grant 权限 on 库名.表名 to 用户名@{主机名|ip地址} identified by ‘密码’;
mysql> flush privileges; //刷新权限
5·查看权限 :show grants for 用户名@{主机名|IP地址};
6·回收权限(删除用户):revoke 权限 on 库名.表名 from 用户名@{主机名|IP地址};
索引---------------------------------------------------------------------------------------------------
功能:加快数据检索的速度,提高查询、插入效率
适合创建索引: 不经常发生变化,一般都为主键字段
查询sql语句较慢的原因:1·可能没建立索引、2·查询语句顺序有问题、3·需要开启慢查询日志查原因
注释:2·---->顺序通过索引字段查询,查询范围放到最后,否则会中断索引
缺点:
1)创建和维护索引都需要消耗时间,消耗时间的长短取决于数据量的多少
2)会占用磁盘空间
3)更新数据库中的数据时,索引也会更新
索引的分类
单列索引:参照一个字段
多列索引:参照多个字段
唯一索引:索引字段唯一
1·创建索引
单列索引
建表创索引 create table 表名 (字段名 字段类型,... ...,index [索引名](索引字段的列表));
直接建索引 create index 索引名 on 表名(字段名);
添加索引 alter table 表名 add index [索引名](索引字段);
唯一索引 alter table 表名 add unique index [索引名](索引字段);
多列索引
建表创索引:create table 表名 (字段名 字段类型,... ...,)index [索引名](索引字段1,索引字段2);
直接创索引:create index 索引名 on 表名(字段1,字段2);
2·查看索引 show create table 表名G;
show index from 表名G ;
3·删除索引 drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
4·索引使用: where子句中引用索引字段;范围放在后面 name=tom and id>100
(范围类型会中断索引)
完整性约束---------------------------------------------------------------
完整性约束就是确保数据库中的数据是有意义的、正确的
为了保证数据的正确性,对关系模型提出的某些约束条件或者是规则。
七类别:非空、唯一、默认值、主键、外键、自增、无符号
语法:
字段名 字段类型 [not null | unique | default 默认值 | auto_increment| unsigned| primary key| foreign key]
1、默认值
create table 表名 (name char(10),city char(10) default 'shenyang');
alter table 表名 modify name char(10) default 'mary';
2、非空
create table 表名 (id int not null,name char(10) not null );
alter table 表名 modify name char(10) not null;
3、唯一
create table 表名 (id int unique,name char(10));
4、自增
要求:1)该字段的类型必须是数值型的
2)字段上要有唯一约束或主键
create table 表名 (id int primary key auto_increment,name char(10));
几点说明:
1)当自增字段发生断档时,值从最大值继续自增
2)当用delete删除最大值时,下一个值仍然从最大值的下一个继续自增
3)当你truncate一个表时,值从1开始重新计算
---@ 为何自增增值默认为1(变量决定)
mysql>show variables like "%increment%";
~~~~~auto_increment_increment 1
auto_increment_offset 1
修改:将上面两行内容赋值,写到配置文件重启生效。
5、主键----primary key = not null + unique
主键是表中的特殊字段,这个字段能够唯一标识表中的每一条记录。
主键用途:快速定位数据的
主键在一张表中最多只能有一个。
主键满足的条件:非空且唯一
1)使用单个字段做主键
a、在字段后直接指定主键约束(列级约束)
create table 表名 (id int primary key,age int,name char(10));
b、整张表的所有字段都定义完成之后再去指定主键(表级约束)
create table 表名 (id int,name char(10),primary key(id));
2)多个字段联合做主键
联合主键只能在所有字段都定义之后,再去定义主键
create table pri2 (id int,name char(10),age int,primary key (id,name));
3)对一个已经存在的表
添加主键:
alter table 表名 add primary key(sno);
删除主键:
alter table 表名 drop primary key; {删除主键,会将非空性约束保留}
6、外键
外键:一个表B中的数据依赖于另一张表A的主键列的数据,如果A表中未出现的值,是不能够出现在B表中的
创建外键的条件:
1)存储引擎是innodb,是mysql5.6默认的引擎
2)相关联字段数据类型要一致
3)最好在外键列上建索引
4)默认创建主外键后,父表中数据不可删除子表所依赖的行
5)子表不可插入父表不存在的值
例子:create table 表1 (dno int,dname char(10),primary key (dno)) engine=innodb;
create table 表2 (eno int,edno int,ename char(10),index(edno),foreign key (edno) references dept(dno)) engine=innodb;
小结:
1)子表中的数据依赖于父表,不能向子表中插入父表中不存在的值
2)不能删除父表中被子表所依赖的行
有了级联删除和级联修改选项,父表中的数据发生删除或者更新时,子表中的数据也会发生相应的变化;删除子表中的行数据,对父表没有影响
on delete cascade 级联删除
on update cascade 级联更新
删除外键
查看外键的名字 mysql> show create table 表名G
mysql> alter table 表名 drop foreign key 表名_ibfk_1;
视图(虚表 | 基表)-----------------------------------------------------------------------
视图是从一个或者多个表中导出来的表片段,重新组合形成逻辑空间
视图是一个从 一个或多个表中 导出来的数据 组成的虚拟的表,在某些地方就管视图叫作虚表。
注:参照的一个或者多个的表,我们叫作基表。
视图的作用:
主要就是提供给用户使用的常用数据,可一个或者多个表当中片段。
(隐藏表真正的字段名称,隐藏不需要的数据)
如果视图中的数据被修改,那么基表 的数据也会被修改;但是视图被删除,对基表没有任何影响。
如果基表中的数据被修改,那么 视图 的数据也会发生变化;
语法:
create view 视图名字 as 来自哪个表(通常是select语句)
创建-----
创建视图的时候,指定了约束条件,视图中的数据必须是满足这个条件的。
如果修改了基表或虚表,导致数据不满足约束条件,那么视图中的数据被踢出。如果重新满足条件,又会出现在虚表中
(1)先在单表的基础上创建视图。
mysql> create view 虚名 as select name,price from 基表名 where name is not NULL;
(2)在多个表上创建视图
mysql> create view 虚名 (id,name,ule) as select 基表1.id,基表1.name,基表2.ule from 基表1,基表2 where 基表.id=基表2.id;
查看视图的信息
(1)mysql> desc 视图名;
(2)mysql> show create view 视图名G;
(3)mysql> show full tables;
(4)mysql> select * from information_schema.viewsG;
修改视图的数据
insert
update
delete
删除视图
mysql> drop view 视图名;
总结:
(1)视图和表的关系
视图的数据来自表;
一个视图可以来自一个表,也可以来自多个表;
基表表的数据发生变化,视图也变;视图的数据发生变化,基表也变。
(2)视图和表的区别
视图是虚拟的表;
视图不占用物理空间,表需要占用物理空间;
创建和删除视图不会影响到表的数据。
(3)在哪些情况下不可以修改视图的数据
创建视图的时候加了约束条件,视图准备要修改的数据不满足约束条件,关键字;
视图中的数据使用了 聚合函数-sum avg max min count (现在可以修改)
(4)不可以创建视图的情况
在存储过程中不能创建视图
在创建视图的过程中不能使用变量
备份和恢复--------------------------------------------------------------------------------------------
备份是为了保证在灾难发生的时候(异地灾备),保证数据不丢失或者是最小程度的丢失(计划任务+脚本来实现自动化)
(一)、备份的分类
1、根据备份方法分
1)冷备份 离线备份(offline backup)
这种备份最简单,直接拷贝物理文件
需要关闭数据库的,然后才能进行备份
注意:通常是在系统刚搭建初期
2)热备份 在线备份(online backup)
无需关闭数据库,直接在线备份
3)温备(warm backup)
无需关闭数据库,但是会对当前数据库的操作有影响,因为会给数据库加全局读锁 mysqldump
2、根据备份后的文件划分
逻辑备份:指备份出来的文件是可读的,也就是文本文件 如:mysqldump
逻辑备份,很多情况下是备份出sql语句,逻辑备份恢复起来时间较长
物理备份:指备份数据库的物理文件 如:ibbackup dbrd
不需要恢复,只需要提供可用的文件系统和数据管理系统即可
3、按照备份数据库的内容来分
完全备份:不管是否发生变化,将全库都备份,一般也发生在系统规划初期
增量备份:仅备份上次备份到这次备份之间发生变化的部分
日志备份:备份二进制日志,二进制日志重做进行备份(主备)
在企业中,一般的备份策略是完全备份+增量备份
备份时间的选择:数据库访问量较小的时候去备份。
(二)、备份 mysqldump
# mysqldump -u 用户名 -p密码 {库名|表名} > 备份路径/XXX.sql
单库备份 库名
单表备份 库名 表名
多表备份 库名 表1 表2
多库备份 -B 库名 库名
全库备份 --all-databases
(三)、恢复
1、单库恢复(要先创建数据库的) mysql> create database 库; //先建库
第一种 mysql> use 库
mysql> source 备份路径/XXX.sql
第二种
# mysql -uroot -p 库 < 备份路径/XXX.sql
2、单表恢复
# mysql -uroot -p 库 < 备份路径/XXX.sql
3、多表恢复
# mysql -uroot -p 库 < 备份路径/XXX.sql
4、多库恢复 (不需要手动建库)
mysql> source /tmp/utdb.sql
5、全库恢复
# mysql -uroot -p < /tmp/all.sql
备份时候加锁
-x:给所有的表加读锁
-l:给单独的表加读锁
存储引擎-------------------------------------------------------------------------------------------------------
存储引擎:不同的存储引擎可以给数据库带来不同的功能和性能。
查看当前数据库软件支持哪些存储引擎:mysql> show engines;
(一)、设置表的存储引擎
1、启动服务时,临时指定默认的存储引擎(不太常用)
# mysqld_safe --default-storage-engine=myisam --user=mysql &
2、永久修改默认存储引擎(对于5.5以上的版本,不添加该行默认也是如此)
vim /etc/my.cnf
default-storage-engine=innodb
3、在建表时直接指定存储引擎
mysql> create table 表 (id int) engine=memory;
(二)、MyISAM引擎
MyISAM存储引擎注重速度,但是不支持事务、不支持外键等。
InnoDB存储引擎注重事务,但是速度会慢一些,目前基本速度差不多,支持外键
MyISAM存储引擎的目录结构
tmy.frm tmy.MYD tmy.MYI
tmy.frm:存储表结构 frame
tmy.MYD:存储表中的数据
tmy.MYI:存储的是表的索引
(四)、InnoDB引擎
InnoDB存储引擎:支持事务、支持行级锁、支持外键 *****
InnoDB存储引擎的目录结构
emp.frm //该存储引擎在数据库目录下只会存放表的结构
表的数据和索引都存放在数据目录下的ibdata1文件中
InnoDB支持事务——事务满足4个特性:ACID (正常来讲:事务是可以回滚和提交)
dml操作支持事务(insert、update、delete)
1、A —— Atomicity 原子性
一个事务是一个整体,它里面的所有的操作要么都做,要么都不做,是不可再分割的。
2、C —— Consistency 一致性
事务开始前和结束后,数据库的完整性约束是一致的
3、I —— Isolation 独立性、隔离性
两个事务之间是互不相干的,是相互独立的
4、D —— Durability 持久性
事务完成之后,对数据库的所有的更改都会持久的保存在数据库中。
事务结束的标志
1、明确执行commit提交,表示确认修改
2、明确执行rollback回滚,表示取消所有的更改
3、遇到ddl语句的时候,自动提交(create、alter、drop、truncate)
注:truncate截断表后,内容不可以回滚
delete删除数据后,可以使用rollback进行回滚
4、正常退出数据库管理系统,自动提交
5、异常退出数据库管理系统,自动回滚
查看事务默认隔离级别:
mysql> select @@tx_isolation
查看是否是自动提交:
mysql> select @@autocommit
如果是0表示不会自动提交,
如果是1表示自动提交
事务常见的四种隔离级别:(逐渐增强)
可以设定全局的变量:global.tx_isolation
READ-UNCOMMITTED 读未提交 ,一方的事务没有提交,另外一方也可以看见
READ-COMMITTED 读提交,只有一方事务提交了,另外一方才可以看见
REPEATABLE-READ 重复读取,一方事务没有提交,另外一方可以读取,但是读取的是事务执行前的内容
SERIALIZABLE 串行,事务可以阻塞只有一方事务提交了,另外一方查看动作一直处于等待状态,另外一方才可以去查看,
修改隔离级别:
mysql> set tx_isolation='';
mysql> set autocommit=0; 手动关闭自动提交
mysql> start transaction; 手动指定去启动一个事务
幻读、脏读
锁-------------------------------------------------------------------------------------------------------
读锁: 共享锁、自己仅对当前库当前表有读权限,阻塞其他人对当前表写操作,允许读
写锁: 排他锁、自己仅对当前库当前表有读写权,阻塞所有其它人对当前表的读写操作
一般情况下,当操作数据库时,数据库是自动加锁解锁的,不需要人工干预的
根据粒度划分(作用范围)
表级锁,行级锁及页级锁
一、读锁
给表加读锁 mysql> lock table 表 read;
解锁 mysql> unlock tables;
二、写锁
给表加写锁 mysql> lock table 表 write;
解锁 mysql> unlock tables;
日志管理-----------------------------------------------------------------------------------------------
日志存放位置:/data/mysql
四类日志:
二进制日志: 记录DDL和DML -----二进制日志作用:数据恢复、AB复制
错误日志: 记录系统运行正确启动信息和错误信息
慢查询日志: 记录慢查询语句 -----一般用于优化查询。
通用日志: 记录所有客户端操作语句 (默认不开启)
(一)、开启各种日志,修改配置文件
1、开启通用查询日志,指定文件名
# vim /etc/my.cnf
查询日志:
log_output = {TABLE|FILE|NONE}
log_output = TABLE,FILE
FILE: gerenal_log
general_log = {ON|OFF}: 是否启用查询日志
general_log_file = www.log:当log_output有FILE类型 时,日志信息的记录位置
交互模式:
> set global general_log=ON;
2、开启慢查询日志,指定文件名,设置超时时间
慢查询日志:
SELECT @@GLOBAL.long_query_time;
# vim /etc/my.cnf
永久生效:
#vim /etc/my.cnf
添加如下两行
slow_query_log = {ON|OFF}:是否启用慢查询日志
slow_query_log_file = /path/to/somefile: 日志文件路径
临时开启某个功能:
mysql>set global slow_query_log='on';
3、错误日志,修改前缀名
# vim /etc/my.cnf
log_error = /path/to/somefile
log_warnings = {ON|OFF}:是否记录警告信息于错误日志中;
4、开启二进制日志
log_bin = /path/to/somefile
binlog_format = MIXED
sql_log_bin = ON
max_binlog_size = 1073741824
二进制日志文件的单文件上限;
max_binlog_cache_size = 18446744073709547520
max_binlog_stmt_cache_size = 18446744073709547520
sync_binlog = 0:设定多久同步一次二进制日志文件;0表示不同步;任何正值都表示记录多少个语句后同步一次;
log-bin=mysql-bin //原有的
(二)、二进制日志的查看 mysqlbinlog
# mysqlbinlog mysql-bin.000011
# at 4 //事件发生的位置信息
#150914 16:30:27 //事件发生的时间信息
(三)、二进制日志恢复
1》时间点 mysqlbinlog --start-datetime='开始时间' --stop-datetime='结束时间' mysql-bin.000012
2》位置点 mysqlbinlog --start-position='开始位置点' --stop-position='结束位置点' mysql-bin.000012
查看日志信息
mysql> show master logs; //显示二进制日志文件的名字和大小的
(四)、对日志的管理
删除日志 不要轻易删除
1)删除某个日志之前的所有日志
mysql> purge master logs to 'mysql-bin.000006'; //删除6以前的日志(不包含6)
2)删除多少天以前的日志文件
mysql> purge master logs before date_sub(current_date,interval 1 day); //删除一天以前的日志
3)重置二进制日志
mysql> reset master; //从000001开始重新计数
4)手动生成新的二进制日志文件
mysql> flush logs;
主从---------------------------------------------------------------------------------------------------------
@@------主备: 保证服务器高可用,一旦主服务器宕机,备节点会接替主节点工作
主主:
两台都开启二进制日志和中继日志;两台主机互相授权;两台主机互相连接
导致:数据多余----避免:主键和自增
主从:
作用: 减轻主服务器压力、实现读写分离
靠把主服务器的二进制日志同步和重做实现:
从服务器靠主服务器给的授权同步权限,连接到主服务器;把主服务器二进制日志同步给从服务器,从服务器靠io—thread接收,转换为自己的中继日志;通过SQL—thread翻交给MySQL进程执行;创建和更改数据库数据(日志重做)
IO_THREAD SQL_THREAD
主:
1· 修改配置文件 server_id开启二进制日志
2· 授权 :同步权限
[3· 全库备份] (保证主从数据一致)
从:
1· 修改配置文件 server_id开启中继日志
2· 全库恢复
3· 连接主服务器
排错:
mysql> slave stop; //停掉slave
0)首先保证关闭selinux和防火墙
1)看change master to 语句是否有问题,如果有,那么就改正,然后重新执行
mysql> change master to
master_host='172.16.254.200',
master_port=3306,
master_user='slave',
master_password='douniwan',
master_log_file='mysql-bin.000003',
master_log_pos=441;
2)在从服务器上尝试使用slave用户登录master数据库
[root@slave ~]# mysql -uslave -pdouniwan -h 172.16.254.200
3)查看主服务器上的日志文件名和位置点是否正确
4)看错误提示去判断
可能原因: 主从的server-id要不一样
5)主服务器解锁 >unlock tables;
运算符--------------------------------------------------------------------------------------------------------
运算符
1、算数运算符 : + - * / % 幂(power) 例子:select power(2,10),2*5,5/3;
2、比较运算符 : > < >= <= == != 等价于 <>
3、逻辑运算符 :and (&&) or (||) not (!)
4、位运算 :
【4<<1 = 8】左位移值=原数x2^位数 向左不可无限大(2^64-1)
【4>>1 = 2】右位移值=原数/2^位数 向右被除数大于原数皆为0
函数(help functions;)----------------------------------------------------------------------------------------
一、时间函数 :curtime() curdate() now() sysdate() year() timestamp()
二、聚合函数 :求和 sum(字段名)
求平均值 avg(字段名)
求最大值 max(字段名)
求最小值 min(字段名)
统计匹配行数 count(字段名)
三、其他函数 :concat() 连接函数
upper() 转换成大写
lower() 转换成小写
length() 求长度
version() 查看版本
database() 查看当前数据库
数据结构-----------------------------------------------------------------------------------------------
数据结构: ***
数值: 整型(tinyint,smallint,mediumint,int,bigint)、浮点(float(m,n),double(m,n))、布尔
字符: char(10) 定长 , varchar(10) 变长 ‘ab’
时间: time date datetime timestamp year ...
枚举: enum 从给定值中任选一个
集合: set 可以从给定值中任选多个
log text blob ....
(一)、数值
整型
表示的数值范围不同,存储这样的一个数据占用的磁盘空间不同
存储 占用字节数 有符号数的范围 无符号数范围
tinyint 1B(8 bits) -128 ~ 127 0 ~ 255 (2^8-1)
smallint 2B -2^15 ~ 2^15-1 0 ~ 65535 (2^16-1)
mediumint 3B
int 4B
bigint 8B
修饰符:
unsigned 无符号
not null 不允许为空,一般情况下,带有约束的字段可以设定为非空(约束有唯一性约束,也可以是主键约束)
浮点型
单精度浮点数:float(M,D) M是总长度,D是小数位的位数 float(5,2) 存储占用空间 4B
双精度浮点数:double(M,D) 存储占用空间 8B
整型也可以指定显示宽度的,但是并不影响取值范围的。
布尔型
类似真或假、0或1、yes或no
(二)、字符
char(10):底层存储定长 范围0~255byte
varchar(10):根据底层存储字符调整底层存储范围0~65535
(会比存储字符多出1~2个字节,表示字符串长度
如果用1个字节标识长度:最多标识到255长度
如果用2个字节标识长度:最多标识到65535长度)
复制记录和复制表----------------------------------------------------------------------------------------
复制记录
1、复制记录(快速插入记录)
> insert into 表1(id,name) select * from 表2;
2、全表复制(复制表的结构和数据,不会复制主键等)
> create table 新表名 [as] select 字段列表 from 已经存在的表;
3、复制表的一部分
> create table 新表 select * from 旧表 where id=1;
只复制表结构
法一:
mysql> create table 新表 select * from 旧表 where 1=0;假的条件
法二:
mysql> create table 新表 like 旧表;
数据的导入导出--------------------------------------------------------------------------------------
(一)导入数据(关闭selinux)
1、创建源文件
导入数据时默认的字段分隔符是 ,默认的行分隔符
2、创建mysql中与源文件数据类型相同的表
3、导入记录
>load data infile "文件路径及名字" into table 表名;
手动指定字段分隔符在结尾加“fields terminated by '分隔符'”
(二)导出数据
> select * from 表 into outfile "文件路径及名字";
手动指定字段分隔符在结尾加“fields terminated by '分隔符'”
----------------------------------------------------------------------------------------------------------
--------@
1、查看mysql的进程列表(即有多少人连接到数据库上正在做什么操作)
mysql> show processlist;
2、非交互式执行sql语句 (面试题)*****
[root@mysql ~]# mysql -uroot -predhat -e "show processlist"
mysql优化---------------------------------------------------------------------------------------------
1·innodb_buffer_pool_size:
一般的策略是,如果数据库很大,远远超过内存时,应尽可能增大该缓冲池;如果数据库很小,一般该值为数据库的10%即可
缓冲池的大小是不能高于内存(看无连接情况下,内存的剩余量)
2·innodb_flush_method
一般建议将该值设定为O_DIRECT,可以避免双重缓冲,让数据库跳过文件系统缓冲直接和设备文件进行交互
3·innodb_log_file_size
一般建议设定为缓冲大小的25% 旧的版本数据库系统默认值为4mb
4·innodb_flush_log_at_trx_commit;
一般建议该值设定为2,在每个事物进行提交时,日志缓冲会被写到文件,但不会对日志行进到磁盘的刷新,对日志文件每秒刷新一次,更加安全
5·innodb_thread_concurrency
线程数量的最大值,一般设定为处理器数量加磁盘数,但是对于高并发事务,要再增大该值
6 sync_binlog
如果开启,则根据该值决定每隔多久会将刷新写入到磁盘;一般建议修改为1,这样最多只会丢失一条记录
7innodb_max_dirty_pages_pct;
该值的范围为0-100,默认为90;数据库中的主线程试着从缓冲池写数据,使得脏页的百分比不超过该值。一般建议设定为50-75
8read_buffer_size;
每隔线程连续描述时,为扫描的每个表分配的缓冲大小;使用默认值即可,必要时还可以指定为全部内存大小
调节缓冲池大小、日志文件大小、当前线程数量、线程扫描数据分配的缓冲大小、二进制日志同步