首页 > 代码库 > 16_索引是什么?
16_索引是什么?
找数据有哪些方式?
-- 全表扫描,但是当数据量达到几万以上,查询速度就慢了
什么是索引?
-- 相当于书的目录,便于查找,索引指向字段,
-- mysql使用 B+tree 索引,本质上是二叉树
索引有哪些分类?
-- 普通:单列做索引,只能帮助查找
-- 唯一:单列增加唯一约束,只能设一个Null,也可以多列联合唯一
-- 主键:内容不允许重复,不能为Null,一张表只能有一个主键,可以多列联合主键
-- 组合:多列共同组合成索引,可以给多列增加唯一约束
-- 全文:分词,mysql依据逗号和空格作为截断符号,对中文支持不好
-- 本质上索引+约束条件
如何创建索引?
-- 创建表结构时候创建索引
index 索引名(字段1,+)
-- create index 索引名 on 表名(列,+) -- 新增索引
-- drop 索引名 on 表名 -- 删除索引
-- show index from 表名 -- 查询表中索引
如何查看select语句查询方式?
-- explain select语句
-- type:ref -- 普通索引
-- type:All -- 全表扫描
-- type:const -- 效率最高,唯一索引
如何组合索引?
primary key(列1,列2)
unique(列1,列2)
index(列1,列2) -- 对于组合索引,列1 和 列1 列2 走索引,单单列2不走索引,最左前缀
limit的有哪些应用?
加到最后,指明找到1条就不在全表扫描
select * from 表名 where 条件 limit 1 -- 找到1跳就立马跳出扫描,返回结果
如何正确的使用索引?
like -- %在第一个位置,不走索引,因为任何值都可以是%号
对索引列加函数 -- 因为每次都对列中数据操作,没法走索引,不妨对条件值做操作
or -- 只要一个没有建立索引,不走索引
类型不一样 -- 传入类型不一致的查询条件,不走索引
!= -- 不等于条件不走索引,但是主键还是走索引
> -- 大于号也不走索引,但是主键还是走索引
order by
-- 取决于映射对象,排序对象不是索引,排序方式是索引,但是不走索引,但是主键还在走索引
组合索引最左前缀 -- 只是单单最后一个,不走索引
覆盖索引
索引合并 -- 两个单列索引
组合索引 --
有哪些注意事项?
-- 避免使用select *
-- count(1) 或count(列) 代替count(*)
-- 创建表尽量使用char 代替varchar,固定长度往前放
-- 组合索引代替多个单列索引,多条件查询
-- 尽量使用短索引
-- 使用连接来代替子查询
-- 连表时候注意类型一致
如何进行分页?
limit a,b -- a表示从第几行开始,b表示后面几行数据 [a,b]
select * from 表名 limit 20000,5 -- 如何优化?
第一种优化方法:
select * from 表名 where id >(select id from表名 limit 20000,1) limit 5
-- 扫描索引表
第二种优化方法:
-- 数据库中自增id可能存在间断
a. 上一页,下一页,一页显示10条数据
获得最大id和最小id
selcet * from 表名 where nid < 9989 order by nid desc limit 10
对于每页显示10条数据?
select * from 表名 where id < 1111 order by id desc limit 10
如何逻辑整理?
-- 假设我找到最大id和最小id
找到极限值,最大id和最小id,假如要让最后面的显示在最前,找到最后的id,
在此基础向上取10条,表示最后一页,98页,如果跳转到94页,
中间差了98-94= 4 *10 条数据,先从最后找到40跳数据,排序,
再通过select * 和 limit 10表示显示数据
找到98页:select * from 表名 where id < 最大id order by id limit 10;
找到94页:1. select id form 表名 where id < 最大id order by id limit 30 -- 找到开始id
2.
此问题最让人困惑的是,到底是降序排序还是升序排序,如何取到最大id和最小id
首先第一步,找出B表总共有几条数据,每页显示几条数据,这里就有个问题,不够显示一页?
那就总页码加1,那就又有一个问题,最下面显示在最前面还是显示在最后面
假设最下面显示在最前面,总共有a条数据,每页显示b条数据,计算出要显示a/b 页数据,
已知最后一条数据的id,设置为c,其中会有删减,那就是说id有间断,
那么最后一页 a/b : select * from B where id < c order by id desc limit b,如果再向前找 d 页,
那么中间会间隔 d*b 条数据 :select id from B where id < c order by id limit d*(b-1),
找到d*(b-1)条数据的id,再对d*(b-1)条数据数据进行降序排序,通过limit 1 找到最小id:
selectt id from(select id from B where id < c order by id limit d*(b-1)) order by asc limit1,
然后通过最小id,显示向前找 d 页的数据 :
select * from B where id < selectt id from(select id from B where id < c order by id limit d*(b-1))
order by asc limit1 order by desc limit b
最让人困惑的是,降序第一个值是最大的,升序第一个值是最小的,还有以那个id做参照物
升序是从小到大,asc ,降序是从大到小,desc
如何找打表中第一条数据的id和最后一条数据的id?
select id from user order by id asc limit 1; -- 找到第一条数据id
select id from user order by id desc limit 1; -- 找到最后一条数据id
16_索引是什么?