mysql 补行_MYSQL补充

1、视图

视图当作表

2、触发器

insert ...

3、存储过程

insert into tb1()

update tb2...

事务:innodb

p12(out status int):

try:

insert into tb1()

update tb2...

set status=1

except ...:

set status=0

call p12()

4、函数

def func(arg):

return arg + 100

select nid from student

# 1,2,3,4,5,6...

select func(nid) from student

# 101,102,103,104

select func(1)

# 101

函数:

mysql内置函数

自定义函数

函数:

SQL不允许

declare a int;

# set a = 123;

select nid into a from student where name='alex' # nid: 11 name:alex

# a = 11

return 返回

# select 函数名(参数)

存储过程:

sql语句

intout,out构造返回值

call: 存储过程名称

索引

功能:

- 约束

- 主键

- 外键

- 唯一

- 普通

- 组合

- 加速查找

为什么索引可以这么快?

name列建立索引?

创建一个文件,name列所有数据拿出来

name='eric' > 6 # 4

name='tony' > 66 # 3

1024

30

10 40

5 15 35 66 (真是表中我当前行的数据在硬盘上的位置)

1 6 11 19 21 39 55 100

1 6 11 19 21 39 55 100

1 6 11 19 21 39 55 100

1 6 11 19 21 39 55 100

1 6 11 19 21 39 55 100

1 6 11 19 21 39 55 100

B-tree

name索引

都有那些索引:

1、创建表

nid name pwd email

数据文件:硬盘,。。。。。。。

2、创建索引

nid主键索引:

name列创建索引

- 数据name列数据全部拿到

- name每一个转化成一个数字,算法

-

30

10 40

5 15 35 66(位置,位置,位置) (数据表中我当前行的数据在硬盘上的位置)

1 6 11 19 21 39 55 100

- 索引文件: 硬盘

pwd列创建索引

- 数据pwd列数据全部拿到

- pwd每一个转化成一个数字

-

30

10 40

5 15 35 66 (数据表中我当前行的数据在硬盘上的位置)

1 6 11 19 21 39 55 100

- 索引文件: 硬盘

搜索:

select * from tb1 where name='alex'

'alex'转换成数字

select * from tb1 where email='alex'

索引种类:

普通索引 - 加速查找

唯一索引 - 加速查找,约束列数据不能重复,null

主键索引 - 加速查找,约束列数据不能重复,不能null

组合索引 - 多列可以创建一个索引文件

1、普通索引

create index 索引名称 on 表(列名)

2、唯一索引

create unique index 索引名称 on 表(列名)

3、主键索引

- 不能重复,不能null

4、组合索引

name,pwd

- 普通组合索引:

无约束

name,pwd

- 联合唯一索引:

有约束,两列数据同时不相同,才能插入,不然报错

name,pwd

查找:最左匹配

select * from tb1 where name = 'alex'

select * from tb1 where name = 'alex' and pwd='123'

select * from tb1 where pwd='123' # 不会走索引

查找:最左匹配

name,pwd,email

select * xx where name ='alex'

select * xx where pwd ='alex'

select * xx where email ='alex'

select * xx where name='alex' and pwd='xx'

=====================

1、覆盖索引

select * from tb where nid=1

# 先去索引中找,

# 在去数据表找

select nid from tb where nid < 10

# 先去索引中找

-- 情况应用上索引,并且不用去数据表中操作,覆盖索引0

-- 只需要在索引表中就能获取到数据时,

2、合并索引

nid name(单独索引) email(单独索引) pwd

select * from tb where name='alex'

select * from tb where email='alex3714@163.com'

select * from tb where name='alex' or email='alex3714@163.com'

nid name(组) email(合) pwd

# 最左前缀

select * from tb where name='alex'

select * from tb where email='alex3714@163.com' ########无法满足########

select * from tb where name='alex' or email='alex3714@163.com'

用户表:

nid username(组) password(合)

1 alex 123

2 shaogbing 123

select * from tb where username='xx' and password='xx'

select * from tb where username='xx'

# select * from tb where password='xx'

--> 组合和合并索引取舍?业务需求来决定

3、执行计划 - 相对比较准确表达出当前SQL运行状况

是否走索引,不走索引

explain SQL语句

1、explain SQL语句

type: ALL - 全数据表扫描

type: index - 全索引表扫面

2、limit

select * from tb1 where email='123'

select * from tb1 where email='123' limit 1;

-----SQL: ALL、Index,都是有优化的余地 -------

4、如何命中索引

nid name ctime

2016-9-10 11:59

当前时间:

2016/9/10

select * from tb1 where conv(ctime,'.,..') = time;

# 转船

select * from tb1 where ctime = 转(2016/9/10)=> 2016-9-10

5、分页

limit x,m : 表x+m

where nid>10000 直接跳过 钱10000条数,继续往下扫

每页:10条

1 2 3 4 ... 18 19 20 21

1 17 31 45

16 29 42 90

-- nid排列可能中断的

---------- 方式: 上一页下一页 ----------

1、当用查看页面时,第一页 limit 0,10: nid: 1 - 16

2、第一页 limit 10,10: nid: 17 - 36

3、第一页 limit 100000,10: nid: 17 - 36

2、第一页 where nid>16 limit 10: nid: 17 - 36

3、第一页 where nid>36 limit 10: nid: 170 - 360

6、慢SQL日志

6、慢SQL日志

标签:alex,name,补充,nid,索引,MYSQL,where,select

来源: https://www.cnblogs.com/gerenboke/p/11801132.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值