数据库部分
1 引擎
- innodb 支持事务 支持行锁表锁 查询慢
- myisam 不支持十五 支持表锁 查询快
2 数据库授权
3 表结构设计
4 sql语句
5 了解:
视图 虚拟表。
存储过程 对结果集合返回值进行复杂操作。
触发器 在对某张表进行:增、删、改的前后自定义操作。
函数 对数据中的值进行操作。
存储过程和函数的区别?
存储过程out可以有返回值, 可以有sql语句
6 索引
索引实现原理:
- B + tree # 树形结构, 左边小, 右边大
- hash # 有点类似字典目录
索引作用: 加速查找+约束
索引种类:
- 主键索引:加速查找、不重复、非空
- 唯一索引:加速查找、不重复
- 普通索引:加速查找
- 联合索引:加速查找
- 联合唯一索引:加速查找、不重复 #:联合索引遵循最左前缀原则。(一定要带着最左边的索引才能命中索引)
名词:
- 覆盖索引:在索引文件中就可以把想要的数据得到。
select name from tb1;
- 索引合并:使用多个单列索引去查找数据。
7 创建索引,但无法命中索引。
https://www.cnblogs.com/wupeiqi/articles/5716963.html
- like '%xx'
select * from tb1 where name like '%cn';
- 使用函数
select * from tb1 where reverse(name) = 'wupeiqi';
- or
select * from tb1 where nid = 1 or email = 'seven@live.com';
特别的:当or条件中有未建立索引的列才失效,以下会走索引
select * from tb1 where nid = 1 or name = 'seven';
select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex'
- 类型不一致
如果列是字符串类型,传入条件是必须用引号引起来,不然...
select * from tb1 where name = 999;
- !=
select * from tb1 where name != 'alex'
特别的:如果是主键,则还是会走索引
select * from tb1 where nid != 123
- >
select * from tb1 where name > 'alex'
特别的:如果是主键或索引是整数类型,则还是会走索引
select * from tb1 where nid > 123
select * from tb1 where num > 123
- order by
select email from tb1 order by name desc;
当根据索引排序时候,选择的映射如果不是索引,则不走索引
特别的:如果对主键排序,则还是走索引:
select * from tb1 order by nid desc;
- 组合索引最左前缀
如果组合索引为:(name,email)
name and email -- 使用索引
name -- 使用索引
email -- 不使用索引
8 数据库优化方案?
- 避免使用select *
- 固定长度在前面
- 硬盘内存代替表,如:性别等
- 读写分离
- 分库
- 分表
- 水平分表
- 垂直分表
- 命中索引
- 组合索引代替索引合并
- 尽量使用短索引
- 如果取一条数据时,使用limit 1
select id,name from tb where name ='alex' limit 1;
- 使用连接(JOIN)来代替子查询(Sub-Queries)