zoukankan      html  css  js  c++  java
  • mysql 二

         索引
            作用:
                - 约束
                - 加速查找
            索引:
                - 主键索引:加速查找 + 不能为空 + 不能重复
                - 普通索引:加速查找
                - 唯一索引:加速查找 + 不能重复
                - 联合索引(多列):
                    - 联合主键索引
                    - 联合唯一索引
                    - 联合普通索引
            
            加速查找:
                快:
                    select * from tb where name='asdf'
                    select * from tb where id=999
                    
            一.普通索引
                ---普通索引仅有一个功能:加速查询
                
                创建表加索引
                create table userinfo(
                    nid int not null auto_increment primary key,
                    name varchar(32) not null,
                    email varchar(64) not null,
                    extra text,
                    index ix_name (name)
                )
                1.创建索引
                        create index ix_name on userinfo(email)
                2.删除索引
                        drop index ix_name on userinfo
                3.显示索引
                        show index from userinfo;
                        
            二、唯一索引
    
                ---唯一索引有两个功能:加速查询 和 唯一约束(可含null)
    
                    create table userinfo(
                        nid int not null auto_increment primary key,
                        name varchar(32) not null,
                        email varchar(64) not null,
                        extra text,
                        unique ix_name (name)
                    )
                    
                    1.创建唯一索引
                                create unique index 索引名 on 表名(列名)
                    2.删除唯一索引
                                drop unique index 索引名 on 表名
                                
            三、主键索引
                    主键有两个功能:加速查询 和 唯一约束(不可含null)
                    create table userinfo(
                        nid int not null auto_increment primary key,
                        name varchar(32) not null,
                        email varchar(64) not null,
                        extra text,
                        index ix_name (name)
                    )
                    OR
                    create table userinfo(
                        nid int not null auto_increment,
                        name varchar(32) not null,
                        email varchar(64) not null,
                        extra text,
                        primary key(ni1),
                        index ix_name (name)
                    )
                    1.创建主键
                            alter table 表名 add primary key(列名);
                    2.删除主键
                            alter table 表名 drop primary key;
                            alter table 表名  modify  列名 int, drop primary key;
                            
            四、组合索引
    
                    组合索引是将n个列组合成一个索引
                    其应用场景为:频繁的同时使用n列来进行查询,如:where n1 = 'alex' and n2 = 666。
    
                    create table userinfo(
                        nid int not null auto_increment primary key,
                        name varchar(32) not null,
                        email varchar(64) not null,
                        extra text
                    )
                    1.创建组合索引
                                create index ix_name_email on userinfo(name,email);
                    
                    2.如上创建组合索引之后,查询:
    
                            name and email  -- 使用索引
                            name                 -- 使用索引
                            email                 -- 不使用索引
                            
            五.组合索引和索引合并的区别
                            
                组合索引-->一个索引有两列(最左前缀匹配)- create unique index 索引名称 on 表名(列名,列名)
                            - drop unique index 索引名称 on 表名
                            
                            - create index ix_name_email on userinfo(name,email,)
                            - 最左前缀匹配
                                    select  * from userinfo where name='alex';
                                    select  * from userinfo where name='alex' and email='asdf';
                                    
                                    select  * from userinfo where email='alex@qq.com'; #这样是不会走索引
                                
                            组合索引效率 > 索引合并 
                                组合索引(两种查找方式)
                                    - (name,email,)
                                        select  * from userinfo where name='alex' and email='asdf';
                                        select  * from userinfo where name='alex';
                                索引合并-->各自建一个索引(2个索引)(三种查找方式):
                                    - name
                                    - email
                                        select  * from userinfo where name='alex' and email='asdf';
                                        select  * from userinfo where name='alex';
                                        select  * from userinfo where email='alex';
                        
                        名词:
                            覆盖索引:
                                - 在索引文件中直接获取数据
                            
                            索引合并:
                                - 把多个单列索引合并使用
                                                
    - 创建索引
            - 命中索引 *****
    
                无法命中索引的几种方式
                
                  --   like '%xx'
                    select * from tb1 where email like '%cn';
                    
                    
                  --   使用函数
                    select * from tb1 where reverse(email) = 'wupeiqi';
                    
                    
                  --   or
                     select * from tb1 where nid = 1 or name = 'seven@live.com';
                    
                    
                    特别的:当or条件中有未建立索引的列才失效,以下会走索引
                           
                            select * from tb1 where nid = 1 or name = 'seven@live.com' and email = 'alex'
                            
                            
                  --   类型不一致
                    如果列是字符串类型,传入条件是必须用引号引起来,不然...
                    select * from tb1 where email = 999;
                    
                    
                  --   !=
                      select * from tb1 where email != 'alex'
                    
                    特别的:如果是主键,则还是会走索引
                        select * from tb1 where nid != 123
                  --    >
                     select * from tb1 where email > 'alex'
                    
                    
                    特别的:如果是主键或索引是整数类型,则还是会走索引
                        select * from tb1 where nid > 123
                        select * from tb1 where num > 123
                        
                        
                  --   order by
                    select name from tb1 order by email desc;
                    
                    当根据索引排序时候,选择的映射如果不是索引,则不走索引
                    特别的:如果对主键排序,则还是走索引:
                        select * from tb1 order by nid desc;
                 
                  --   组合索引最左前缀
                    如果组合索引为:(name,email)
                    name and email       -- 使用索引
                    name                 -- 使用索引
                    email                -- 不使用索引
                
            分页 比如拿去第200万条数据
                a. select * from userinfo limit 20,10;
        
                b.- 索引表中扫:
                    select * from userinfo where id in(select id from userinfo limit 200000,10)
                - 方案:
                    记录当前页最大或最小ID
                    1. 页面只有上一页,下一页
                        # max_id
                        # min_id
                        下一页:
                            select * from userinfo where id > 200000 limit 10;
                            select * from userinfo where id > max_id limit 10;
                        上一页:
                            select * from userinfo where id < 200000 order by id desc limit 10;
                            select * from userinfo where id < min_id order by id desc limit 10;
                    2. 上一页 192 193  [196]  197  198  199 下一页
                        
                        select * from userinfo where id in (
                            select id from (select id from userinfo where id > max_id limit 30) as N order by N.id desc limit 10
                        )
  • 相关阅读:
    Flex的 Event中属性currentTarget与target的差别
    考研复试机试题(2010)
    Android应用性能优化之使用SparseArray替代HashMap
    机房收费重构版总结
    中英文对照 —— 缩略词
    NLP(paper + code)
    NLP(paper + code)
    优化与凸优化初始
    优化与凸优化初始
    工具类与工具函数 —— 素数相关
  • 原文地址:https://www.cnblogs.com/chvv/p/10032418.html
Copyright © 2011-2022 走看看