数据库知识还是比较基础和重要的,大学毕业之后对这块的深入学习有所懈怠,工作中实践的时候发现基础比较薄弱,还是要着重练习,并且深入底层系统性的学习。在此过程中我列了一份MySQL学习计划,贴在这里,以供其他刚毕业的同学参考。学习过程也会记录在博客里,对以后回顾能有所帮助。
6.7-6.20(两周)
SQL基础语法熟练
包括sql各种查询语句、建库建表、建立索引等
6.21-6.27
MySQL体系结构和InnoDB存储引擎
包括MySQL体系结构、MySQL表存储引擎等
6.28-7.4
索引与算法
包括InndoDB存储引擎索引、B+树索引、哈希算法等
7.5-7.11
锁和事务
包括InndoDB存储引擎中的锁、锁的算法、锁的问题、事务的实现、分布式事务等
7.12-7.18
MySQL性能调优
包括内存的重要性、硬盘对数据库性能的影响、不同的文件系统对数据库性能的影响
7.19-7.25
文件
包括参数文件、日志文件、pid文件、套接字文件、表结构定义文件、InndoDB存储引擎文件
7.26-8.1
表
包括InndoDB逻辑存储结构、InndoDB物理存储结构、InndoDB行记录格式、InndoDB数据页结构
8.2-8.8
表
包括约束、视图、分区表
8.9-8.15
备份与恢复
包括冷备份、热备份、逻辑备份、快照备份、复制
数据库的安装初始化这些就不赘述了,下面列举一些常用命令和示例
一、数据库层面
1、登录
mysql -u user_name -p 输入后会提示输入密码(user_name在我本机是root)
2、查看当前的数据库
show databases;
3、使用数据库
use database_name; database_name为某个数据库的名称
4、创建数据库
create database database_name; 例如,
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
5、删除数据库
drop database database_name;
二、表层面
1、查看当前数据库的表,需要选择数据库之后才能使用
show tables
如果没有选数据库,会出现以下错误提示
2、查看某个表中的所有列名(属性信息)
describe table_name;(也可以简写为:desc table_name;)
一系列操作如下图
3、也可以选择某一列数据
select column_name from table_name;
或者select * from table_name; 可以查看某个表中的所有数据,不过实际操作一般要加limit限制
4、创建表语句
举例
CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中 NOT NULL 是表示该字段不为NULL,PRIMARY KEY (`runoob_id`)表示runoob_id是该表的主键
5、重命名某张表
alter table table_name rename new_name;
6、向表中添加/删除列名(属性名)
alter table table_name add column_name type;
alter table table_name drop column_name;
对表级别增加或删除列的操作是会锁表的,执行时间和表的大小有关,我这张user_tab中列并不多,但是有一千万数据,导致增加一列耗时34s,删除一列耗时22s,这种操作在生产环境中也是比较耗时的,对于数量亿级别的大表,很有可能因为操作时间过久而无法新增列,此时业务需要考虑分库分表了。
7、修改表中的某个列
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
可见,修改列名的操作也是十分耗时间的
8、查看表的索引
show index from <表名>;
可以看到,我的user_tab中有两个索引,其中id是主键索引,username是唯一索引
9、创建索引
CREATE INDEX indexName ON table_name (column_name);
此外,新增索引的方式也有修改表结构
ALTER table tableName ADD INDEX indexName(column_name)
或者创建表的时候直接指定。
10、删除索引
DROP INDEX [indexName] ON mytable;
一系列操作如下图
唯一索引:
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它与普通索引创建方式有所不同:
CREATE UNIQUE INDEX indexName ON mytable(username(length));
如果增加索引的列存在相同值,那么加唯一索引会失败
三、数据行层面
1、向表中添加一行记录
insert into table_name values(....); (括号里面的值必须要对应创建表时列的前后顺序,且用逗号隔开)
除此之外,还可以用这种形式:
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
2、删除表中特定的行
delete from table_name where P;
P是一个条件,一般格式是:col_name = value,即属性等于某个值的一行,它用来筛选特定的行。省略where子句将会删除整个表的行。
3、修改/更新行
update table_name set col_name = new_val where P;
操作如下图: