• 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

  • 相关阅读:
    FORTRAN学习记录
    Ubuntu查看和自动挂载硬盘
    正则表达式批量重命名
    [USACO 09FEB]Fair Shuttle
    [ZJOI 2012]灾难
    [BJOI 2010]次小生成树Tree
    Python开发 第一篇 python的前世今生
    关于pycharm字体大小的调整
    关于"人工智能Python""系统环境变量设置步骤
    [洛谷P1168]中位数
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7003812.html
Copyright © 2020-2023  润新知