您的位置:首页 > 其它

16_索引是什么?

2017-06-13 22:12 148 查看
找数据有哪些方式?

-- 全表扫描,但是当数据量达到几万以上,查询速度就慢了

什么是索引?

-- 相当于书的目录,便于查找,索引指向字段,

-- 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: