- 基本操作
- drop、truncate和delete的区别
- CURD(核心,哈哈哈)
- 三范式
- 乐观、悲观锁
- 存储引擎
- 索引
- 如何优化数据库
- mysql认知
- 三大范式是什么?
- 怎么区分三大范式?
- 数据库五大约束是什么?
- 主键是什么,怎么设置主键?
- 数据库的外键是什么?
- innodb和myisam有什么区别?
- 什么是索引?
- 索引是个什么样的数据结构呢?
- innodb索引的实现原理是什么?
- btree和hash类型的索引有什么不同?
- 什么是覆盖索引?
- B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引?
- 在建立索引的时候,都有哪些需要考虑的因素呢?
- 联合索引/多列索引的注意事项是什么?
- 导致索引失效的原因有哪些?
- Explain 怎么用来做sql优化?
- 主键使用自增ID还是UUID?
- 字段为什么要求定义为not null?
- drop、delete与truncate分别在什么场景之下使用?
- MySQL中的varchar和char有什么区别?
- varchar(10)和int(10)代表什么含义?
- 超大分页怎么处理?
- 关心过业务系统里面的sql耗时吗?统计过慢查询吗?
- 对慢查询都怎么优化过?
- 上面提到横向分表和纵向分表,可以分别举一个适合他们的例子吗?
- LEFT JOIN 、RIGHT JOIN、INNER JOIN 区别?
- UNION、UNION ALL区别?
- 说一说常用 的MySQL 函数
- 你的sql优化常用技巧有哪些?
- 同一个字段,用 int 还是 char 查询效率高?
- SQL编写题,一些实例,考察一下
- 1、查询每个学生的学号、姓名和每门课的成绩;
- 2、查询都学过2号同学(sid=2)学习过的课程的同学的学号
- 3、查询“语文(cid=1)”课程比“数学(cid=2)”课程成绩高的所有学生的学号;
- 4、查询平均成绩大于60分的同学的学号和平均成绩;
- 5、查询所有同学的学号、姓名、选课数、总成绩;
- 6、查询姓“周”的老师的个数;
- 7、查询没学过“叶平”老师课的同学的学号、姓名;
- 8、查询学过“语文(cid=1)”并且也学过“数学(cid=2)”课程的同学的学号、姓名;
- 9、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
- 10、查询课程编号“数学(cid=2)”的成绩比课程编号“语文(cid=1)”课程低的所有同学的学 号、姓名;
- 11、查询所有课程成绩小于60分的同学的学号、姓名;
- 12、查询没有学全所有课的同学的学号、姓名;
- 13、按平均成绩从高到低显示所有学生的“语文“、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分
- 14、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
- 15、查询男生、女生人数 :以如下形式显示:男生人数,女生人数
- 16、查询课程名称为“数学”,且分数低于60的学生姓名和分数
- 17、查询两门及两门以上不及格课程的同学的学号及其平均成绩
- 18、检索“cid=4”课程分数小于60,按分数降序排列的同学学号
- hash索引的实现原理是什么?
- 讲一下你理解的B+树索引是怎么实现的?
- 索引是如何存储在磁盘上的?
- 什么是事务?
- 事务的四大特性?
- 没有隔离级别的话,多事务并发进行会造成什么问题?
- 事务的隔离级别和各自解决的问题是什么?
- InnoDB使用的是哪种隔离级别呢?
- 数据库事务的使用的规范有哪些?
- InnoDB怎么实现的事务ACID特性?
- InnoDB的事务为什么是原子性的?
- InnoDB是如何保证隔离性的?
- 事务的持久性如何保证?
- 事务的一致性,指的是什么?
- MVCC是什么,如何实现?
- InnoDB的MVCC实现原理是什么?
- 可重复读(repeatable read)级别如何避免幻读?
- mysql的锁了解么,如何分类?
- 乐观锁和悲观锁是什么,如何实现?
- 锁的粒度有哪几种?
- 锁的兼容性对比
基本操作
-
连接数据库:
mysqld -uroot -p -h127.0.0.1 -p3306
-
查看所有库:
show databases;
-
选择库:
use laravel_dev;
-
创建库:
create database sxy_blog;
-
删除库:
drop database sxy_blog;
-
查看所有表:
show tables;
-
查看表结构:
show create table sxy_users;
、desc sxy_users;
-
创建表:
create table shuxiaoyuan (
`id` int unsigned not null auto_increment,
`username` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
-
清空表数据:
TRUNCATE shuxiaoyuan;
-
删除表:
drop table shuxiaoyuan;
-
添加字段:
bbb
,默认为null
,在字段username
后面
ALTER TABLE `shuxiaoyuan` add COLUMN `bbbb` CHAR(50) NULL DEFAULT NULL AFTER `username`;
-
删除字段:
ALTER TABLE 表名 DROP COLUMN 字段名;
-
修改字段
# 修改字段长度:
ALTER TABLE 表名 MODIFY COLUMN 字段名 数据类型(修改后的长度)
# 修改字段名称
alter table <表名> change <字段名> <字段新名称> <字段的类型>
drop、truncate和delete的区别
先放一个链接吧:点击此处
CURD(核心,哈哈哈)
insert、select、update、delete
insert into shuxiaoyuan (aaa,bbb,ccc) value('1','2','3');
select * from shuxiaoyuan where aaa = '1';
update shuxiaoyuan set bbb = 'bbbbbb' where id = 1;
delete from shuxiaoyuan where id = 1;
三范式
- 属性具有原子性,不可再分
- 唯一性约束,每条记录有唯一标识,非主键必须依赖主键
- 冗余性约束,非主键之间不能相互依赖
乐观、悲观锁
说明:查询时 select for update
,然后再提交 update
操作
实际中更严谨一点,带上更新前的状态,例如:
update order_table set status = '更新为已付款' where order_id = 001 and status = '更新前为待支付' and ...
乐观锁
我们在使用乐观锁时会假设在极大多数情况下不会形成冲突,只有在数据提交
的时候,才会对数据是否产生冲突进行检验。如果数据产生冲突了,则返回错误信息,进行相应的处理。
实现:MySql最经常使用的乐观锁时进行 版本控制
或 时间戳
,也就是在数据库表中增加一列,记为version
,当我们将数据读出时,将版本号一并读出,当数据进行更新时,会对这个版本号进行加 1,当我们提交数据时,会判断数据库表中当前的version
列值和当时读出的version
是否相同,若相同说明没有进行更新的操作,不然,则取消这次的操作。
悲观锁
MySql的悲观锁就是打开事务,当启动事务时,如果事务中的sql语句涉及到索引
并用索引进行了条件判断
,那么会使用行级锁
锁定所要修改的行,否则使用表锁
锁住整张表。
事务
ACID 特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)
深入了解:事务隔离级别
存储引擎
索引
聚族索引与非聚族索引的区别
- 聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针
如何优化数据库
范围太管,针对几个点回答一下就行