- 存储过程补充
- 支持事务
在存储过程的代码块中,可以写事务,比如出错了,回滚到改变前的状态
- sql游标
- 不常用
- 在什么情况才使用:需要对表中的数据行与另一列的行的数据进行操作时需要使用
- 动态执行sql(防止sql注入)
delimiter //
create produce p(
in sql varchar(10)
in arg int )
begin
--代码逻辑
1 预测 sql语句是否合法
2 sql语句格式化
3 执行sql语句
end
delimiter ;
现在放sql注入就有两种方法了
- pymysql 语句传参数
- 存储过程的代码快实现
- 索引
- 作用
- 约束
- 加速查找
- 事例
-1 select * from table 字段=value
-2 select * from table id=value (id是主键)
1语句和2语句的速度会天差地别,2远远快于1,为什么呢?建立索引的时候就相当于是帮一本书建立了一个目录,主键就是目录,这时候要查找内容,直接输入目录就可以找到迷路对应的内容了,语句1就相当于是去一个没有目录的书里面去查找某个内容
当建立索引的时候其实额外创建了一张映射,key是索引,value是表数据行。
- 索引种类
- hash索引
- 特点:
- 查询个值快
- 范围查找就慢了,因为他要一个一个的寻找
- btree
- 技术栈
二叉树查找
- 分类
- 普通索引
- 主键索引
- 唯一索引
- 联合索引
- 无法命中索引的情况(此时的查询速度会慢一截)
- 类型不一致时
select nid from table where id=‘12’;
nid定义时如果是整形,那where关键字后的12就不要加括号。
- !=
不等号除主键意外的字段会无法命中索引
- order by
前后字段不一致无法命中索引
select name from table limit 0,10 order by gender;
name字段和gender不一致
- 其他注意
- 避免使用 select *
- 使用char代替varchar
- count(1),count(字段)代替count(*)
- 增删改查操作优先使用固定长度的字段
- 尽量使用短索引
- 链表操作注意字段类型一致(表结构)
- 预测
- 可以预测sql语句的执行时间
- 日志
- 执行时间超出某个范围的
- 未命中索引的
-
-需要配置
- 分页
- 普通
select * from table limit 0,10;
效率不高,因为当基础页特别大的时候,会几近于全表扫描,速度会慢下来
- 提高效率方案
- 做标记
不要进行全表扫描即可,比如我现在处于1000,10的页码,我将1000这个页码记录下来,下次就从这儿开始查起
max_id
min_id
- 上一页
select * from table where id>1010 limit 10;
- 下一页
select * from table where id<990 limit 10;
- orm框架 sqlalchemy
- 对sql语句使用类封装,就是建立起映射,以后就不用写sql语句了,写类就可以了。相比于pymysql,封装地更高级