MySQL数据库学习
Posted longblogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库学习相关的知识,希望对你有一定的参考价值。
1 mysql数据库简介
MySQL是一个关系型数据库管理系统(relational database management system,RDBMS)
常用的关系型数据库软件有:MySQL、MariaDB、Oracle、SQL Server、PostgreSQL、DB2
1.1 RDBMS数据库的特点
- 数据以表格的形式出现
- 每行记录数据的真实内容
- 每列记录数据真实内容的数据域
- 无数的行和列组成一张表
- 若干的表组成一个数据库
1.2 MySQL引擎
包括:ISAM、MyISAM、InnoDB、Memory、CVS、BlackHole、Archive、Performance_Schema、Berkeley、Merge、Federated、Cluster/NDB等,其中MyISAM与InnoDB使用最广泛
1) MyISAM与InnoDB引擎功能对比
引擎特性 |
MyISAM |
InnoDB |
批量插入的速度 |
高 |
中 |
集群索引 |
不支持 |
支持 |
数据缓存 |
不支持 |
支持 |
索引缓存 |
支持 |
支持 |
数据可压缩 |
支持 |
不支持 |
硬盘空间使用 |
低 |
高 |
内存使用 |
低 |
高 |
外键支持 |
不支持 |
支持 |
存储限制 |
没有 |
64TB |
事务安全 |
不支持 |
支持 |
锁机制 |
表锁 |
行锁 |
B树索引 |
支持 |
支持 |
哈希索引 |
不支持 |
支持 |
全文索引 |
支持 |
不支持 |
- MyISAM:MySQL5.0之前的默认数据库引擎,MyISAM其执行数据速度比InnoDB更快,但不提供事务支持,不支持外键,如果执行大量的select操作,MyISAM是更好的选择,支持表锁
- InnoDB:MySQL5.5之后默认引擎为InnoDB,事务型数据库的首选引擎,支持ACID事务,支持外部键、行级锁等高级数据库功能,执行大量的insert或update操作可以使用InnoDB引擎。
A-原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
C-一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态
I-隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的
D-持久性(durability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
2 MySQL数据库字符集设置
有以下两种方法
1) 编辑vim /etc/my.cnf配置文件,在相应段中加入相应的参数字符集,修改完毕后重启MySQL服务即可
- [client]字段里加入:default-character-set=utf8
- [mysqld]字段里加入:character-set-server=utf8
- [mysql]字段里加入:default-character-set=utf8
2) MySQL命令行中运行如下指令
- show variables like ‘%char%’;
- SET character_set_client=utf8;
- SET character_set_results=utf8;
- SET character_set_connection=utf8;
3 MySQL管理工具
3.1 mysql工具
mysql是一个简单的命令行SQL工具,该工具支持交互式和非交互式
例:mysql -u root -p -h 192.168.1.100
3.2 mysqladmin工具
mysqladmin是一个执行管理操作的工具,使用它可以检查服务器配置、当前运行状态,以及创建、删除数据库等
1)修改root密码
mysqladmin -u root -p password ‘newpassword‘
2)创建数据库
mysqladmin -uroot -p create daba-test
3)删除数据库
mysqladmin -uroot -p drop daba-test
3.3 mysqldump工具
mysqldump是一个数据库逻辑备份程序,可以使用它对一个或多个MySQL数据库进行备份或将数据库传输至其他MySQL服务器,执行mysqldump时需要账户拥有SELECT权限才可以备份数据库
mysqldump不是大数据备份的解决方案,mysqldump需要通过重建SQL语句来实现备份功能,对于数据量比较大的数据库备份与还原操作速度比较慢
对于mysqldump备份的数据文件,可以使用mysql命令工具还原数据
1)备份所有数据库
mysqldump -u root -p --all-database > all_database_sql
2)备份mysql数据库
mysqldump -u root -p --database mysql > mysql_database_sql
mysqldump mysql > mysql_database_sql
两者之间的差别在于不使--database选项,则备份输出信息中不会包含CREATE DATABASE或USE语句。不使--database选项备份的数据文件,在后期进行数据还原操作时,如果该数据库不存在,必须先创建改数据库
3)备份mysql数据库下的user表
mysqldump -u root -p mysql user > user_table
4)使用all_database_sql数据库备份文件还原数据库
mysql -u root -p < all_database_sql
5)使用mysql_database_sql数据库备份文件还原数据库
myslq -u root -p mysql < mysql_database_sql
6)使用user_table数据库备份文件还原数据表
mysql -u root -p mysql < user_table
4 SQL(结构化查询语言)
SQL(结构化查询语言)主要分为六部分:数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)、数据控制语言(DCL)、事物处理语言(TPL)、指针控制语言(CCL)
4.1 数据定义语言(DDL)
用于数据库、表的创建与操作
1) CREATE
- CREATE DATABASE 创建数据库
CREATE DATABASE test; 创建test数据库
- CREATE TABLE 创建数据表
CREATE TABLE tb (id INT NOT NULL AUTO_INCREMENT,name CHAR(20) NOT NULL,PRIMARY KEY (id)); 创建tb表
2) ALTER
- ALTER DATABASE 修改数据库属性
ALTER DATABASE test DEFAULT CHARACTER SET=UTF8; 修改数据库默认的字符集
- ALTER TABLE 修改数据表结构,如:添加删除的列、创建删除的索引、修改数据类型等
ALTER TABLE tb RENAME tb1; 重命名tb表为tb1
ALTER TABLE tb1 ADD PRIMARY KEY (id); 设置id为主键
ALTER TABLE tb1 DROP COLUMN name ; 删除name列
ALTER TABLE tb ADD index(name); 添加索引
3) DROP
- DROP TABLE 删除一个或多个数据表,所有的表数据以及表定义都将被删除
DROP TABLE tb;
- DROP INDEX 删除特定数据表中的索引
DROP INDEX name ON tb; 删除索引
- DROP DATABASE 删除数据库以及数据库中的所有数据表
DROP DATABASE test;
4) RENAME
- RENAME TABLE 用来对一个或多个数据表进行重命名
RENAME TABLE tb TO temp;
RENAME TABLE tb TO temp,tb1 TO temp1;
4.2 数据操作语言(DML)
用于添加,修改和删除表中的行
1) INSERT 向数据表中插入一行新的数据
INSERT INTO tb (id,name) VALUES (2,"jack");
2) UPDATE 更新数据表中现有的数据值
UPDATE tb SET name="xiaoming" WHERE id=2;
3) LOAD DATA INFILE
用来快速从文本文件中读取数据到数据表中。
分隔符:文件默认使用Tab键为列的分隔符,行分隔符为换行符。可以使用FIELDS TERMINATED BY设置列分隔符,通过LINES STARTING BY设置行分隔符
注:LOAD DATA LOCAL INFILE 文件从客户端主机读取
LOAD DATA INFILE文件必须位于服务器上, 且文件必须处于数据库目录或可被所有人读取的地方
- LOAD DATA INFILE ‘/var/lib/mysql/1.txt‘ into table tb;
- LOAD DATA INFILE ‘/var/lib/mysql/2.txt‘ INTO TABLE tb FIELDS TERMINATED BY ‘,‘;
4) DELETE
用来把满足条件的数据记录删除并返回删除的记录数量
DELETE FROM tb WHERE id=2;
4.3 数据查询语言(DQL)
用于查询数据表中的数据记录
- SELECT
SELECT * FROM tb; 查询数据表中的所有的数据记录
SELECT name FROM tb; 查询数据表中name记录
SELECT COUNT(id) FROM tb; 统计id记录的总数
SELECT * FROM tb WHERE id=1; 查询id为1的所有记录
4.4 数据控制语言(DCL)
用来设置或者更改数据库用户或角色权限的语句
1) GRANT
- 创建tomcat账户,仅可以通过本机连接MySQL,账号密码为pass,对test数据库中所有数据表拥有所有权限
GRANT ALL ON test.* to ‘tomcat‘@‘localhost‘ IDENTIFIED BY ‘pass‘;
- 创建tomcat账户,仅可以通过192.168.1.100连接MySQL,账号密码为pass,对所有数据库拥有查询权限
GRANT SELECT ON *.* to ‘tomcat‘@‘192.168.1.100‘ IDENTIFIED BY ‘pass‘;
2) REVOKE
撤销账户权限
- 撤销tomcat对test数据库的所有权限
REVOKE ALL ON test.* FROM [email protected]‘%‘;
- 撤销tomcat对所有数据库的查询权限
REVOKE SELECT ON *.* FROM [email protected]‘%‘;
4.5 事物处理语言(TPL)
能确保被DML语句影响的表的所有行及时得以更新, TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK
4.6 指针控制语言(CCL)
像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作
5 创建、修改与删除数据库账号密码
5.1 创建、修改数据库账号密码
1) GRANT 创建账号并赋予权限
GRANT ALL ON test.* to ‘tomcat‘@‘localhost‘ IDENTIFIED BY ‘pass‘;
2) 直接修改数据库权限数据表mysql.user
修改root密码为newpwd,PASSWORD()的作用用来对密码加密存储,使用FLUSH PRIVILEGES更新该权限数据表
UPDATE mysql.user SET Password = PASSWORD(‘newpwd‘) WHERE User= ‘root‘;
FLUSH PRIVILEGES;
3) 通过mysqladmin设置账号密码(在shell中执行)
mysqladmin –u root –p password ‘centos‘
4) SET PASSWORD命名设置密码
设置root从192.168.1.100主机连接MySQL服务器的账号密码
SET PASSWORD FOR ‘root‘@‘192.168.1.100‘ = PASSWORD(‘newpwd‘);
设置root从本机连接MySQL服务器的账号密码
SET PASSWORD FOR ‘root‘@‘localhost‘ = PASSWORD(‘newpwd‘)
5.2 删除数据库账号
DROP USER ‘tomcat‘@‘localhost‘;
6 MySQL数据库索引
MySQL索引可以用来快速地寻找某些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果MySQL没有索引,执行select时会从第一个记录开始扫描整个表的所有记录,直到找到符合要求的记录
1)常见索引类型包括:
- 普通索引(normal):使用最广泛
创建索引命令:ALTER TABLE tb ADD INDEX index_name(id);
index_name为索引名称,自定义
- 唯一索引(unique):不允许重复的索引,允许有空值
创建索引命令:ALTER TABLE tb ADD UNIQUE(id);
- 全文索引(full text):只能用于MyISAM表,主要用于大量的内容检索
创建索引命令:ALTER TABLE tb ADD FULLTEXT(id);
- 主键索引(primary key):又称特性的唯一索引,不允许有空值
创建索引命令:ALTER TABLE tb ADD PRIMARY KEY(id);
- 组合索引:为提高MySQL效率可建立组合索引
创建索引命令:ALTER TABLE tb ADD INDEX index_name(id1,id2);
2)查看索引:
show index from tb;
show keys from tb;
3)删除数据表索引
DROP INDEX index_name ON tb;
ALTER TABLE tb DROP INDEX index_name;
ALTER TABLE tb DROP PRIMARY KEY;
7 MySQL数据库慢查询
MySQL慢查询日志指运行时间超过long_query_time值得SQL语句,慢查询主要用于跟踪异常的SQL语句,可以分析出当前程序里哪些SQL语句比较耗费资源
7.1 查看数据库是否开启慢查询
show variables like "%slow%";
show variables like "%long_query%";
log_slow_queries 慢查询日志功能关闭开启状态
slow_launch_time thread create时间,单位为秒,如果thread create的时间超过了这个值, 该变量slow_launch_time的值加1
slow_query_log 慢查询日志关闭开启状态
slow_query_log_file 慢查询日志文件
long_query_time 慢查询超时时间,默认为10s
log_queries-not-using-indexes 记录未添加索引的SQL语句
7.2 开启MySQL慢查询日志的方法
两种方法:
1)set global slow_query_log=on;
2)修改my.cnf配置文件
log-slow-queries=/data/mysql/localhost.log
long_query_time=2
log-queries-not-using-indexes
7.3 慢查询日志分析命令mysqldumpslow
1)参数说明:
-s:排序方式 按锁的时间l、返回的记录数r、查询的时间t、记录的次数c,倒序加r,平均锁定时间al,平均返回记录数ar,平均查询时间at
-t:查询前多少条记录
-g:支持正则表达式,以及忽略大小写
2)例:查询按时间返回前2条日志信息,
mysqldumpslow -s t -t 2 /data/mysql/localhost.log
以上是关于MySQL数据库学习的主要内容,如果未能解决你的问题,请参考以下文章