
- 引擎
- innodb
- 事务
- 行锁/表锁
- 表锁:
select * from tb for update;
- 行锁:
select id,name from tb where id=2 for update ;
- myisam
- 全文索引
- 快
- 表锁
- select * from tb for update;
- 设计表(*)
- FK
- M2M
PS:
- 数据库部分:课程、老师、学生、分数
- 博客
- 权限表
- 查询表中的数据(*)
PS:41题
- 概念:
- 触发器
- 函数
- 聚合:max/sum/min/avg
- 时间格式化 date_format
- 字符串拼接 concat
- 存储过程
以上内容都是保存在数据库中。
- 索引: B+/哈希索引 =》 查找速度快;更新速度慢
单列:
- 普通索引:加速查找
- 唯一索引: 加速查找 + 约束:不能重复
- 主键: 加速查找 + 约束:不能重复 + 不能为空
多列:
- 联合索引
- 联合唯一索引
PS:遵循最左前缀的规则
其他词语:
- 索引合并,利用多个单例索引查询;
- 覆盖索引,在索引表中就能将想要的数据查询到;
- 创建了索引,应该如何命中索引? 那种情况下,创建了无法命中索引?
- 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 -- 不使用索引
- 看-看:
- 如何开启慢日志查询?
slow_query_log = ON 是否开启慢日志记录
long_query_time = 2 时间限制,超过此时间,则记录
slow_query_log_file = /usr/slow.log 日志文件
log_queries_not_using_indexes = ON 为使用索引的搜索是否记录
- 执行计划
explain select * from tb;
- 导入和导出
- 数据库分页
select * form tb limit 10 offset 0
select * form tb limit 10 offset 10
select * form tb limit 10 offset 20
select * form tb limit 10 offset 30
...
select * form tb limit 10 offset 3000000
答案一:
先查主键,在分页。
select * from tb where id in (
select id from tb where limit 10 offset 30
)
答案二:
按照也无需求是否可以设置只让用户看200页
答案三:
记录当前页 数据ID最大值和最小值
在翻页时,根据条件先进行筛选;筛选完毕之后,再根据limit offset 查询。
select * from (select * from tb where id > 22222222) as B limit 10 offset 0
如果用户自己修改页码,也可能导致慢;此时对url种的页码进行加密(rest framework )。


- 引擎
- 设计表
- FK
- M2M
- 基本操作
- 库
- 表
- 存储过程、视图、函数、触发器
- 触发器,在数据库某个表进行‘增删改’前后定义一些操作。
- 函数,在SQL语句中使用函数。
- select sleep(5)
- select date_format(ctime,'%m') from tb;
- 存储过程,将SQL语句保存到数据库中,并命名;以后在代码中调用时,直接发送名称。
参数:
- in
- out
- inout
代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行存储过程
cursor.callproc('p1', args=(1, 22, 3, 4))
# 获取执行完存储的参数
cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
result = cursor.fetchall()
conn.commit()
cursor.close()
conn.close()
print(result)
- 视图,对某些表进行SQL查询,将结果显示实时显示出来(只能查)
v = select * from tb where id <1000
select * from v
select * from (select * from tb where id <1000) as v
PS: 都是保存在数据库
- 索引
- 命中索引
- 优化
- 不用 select *
- 固定长度字段列,往前放
- char和varchar
- 固定数据放入内存:choice
- 读写分离,利用数据库的主从进行分离:主,用于删除、修改更新;从,查。
- 分库,当数据库中表太多,将表分到不同的数据库;例如:1w张表
- 分表,
- 水平分表,将某些列拆分到另外一张表;例如:博客+博客详细
- 垂直分表,将历史信息分到另外一张表中;例如:账单
- 缓存:利用redis、memcache
- 其它:
- 慢日志
- 执行计划
- 分页
补充:
text类型,创建索引,只能创建前几个字符;
