首页 > 代码库 > 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_索引是什么?