10.18 数据库之索引优化方案

        索引
            作用:约束+加速查询
                普通索引
                    create index ix_name on 表名(字段)
                    作用:加速查询
                    
                唯一索引:
                    作用:约束和加速查询
                create unique index un_index_name on big_data(email)
                
                主键索引
                
                #覆盖索引:在索引文件中直接获取数据
                    例如:
                    select name from big_data where name = 'alex50000';
                    
                #索引合并:把多个单列索引一起使用
                    select * from  big_data where name = 'alex13131' and id = 13131;
                    
                #联合索引:
                    联合普通索引
                    联合唯一索引
                    联合主键索引
                    select * from  big_data where name = 'alex13131' and id = 13131;
                    
                
                # 最左前缀
                 如果使用组合索引如上,name和email组合索引之后,查询
                 (1)name和email ---使用索引
                 (2)name        ---使用索引
                 (3)email       ---不适用索引
                  对于同时搜索n个条件时,组合索引的性能好于多个单列索引
            ******组合索引的性能>索引合并的性能*********
    
                对于索引
                    1.创建索引
                        注意事项:
                               (1)避免使用select *
                               (2)count(1)或count(列) 代替count(*)
                               (3)创建表时尽量使用char代替varchar
                               (4)表的字段顺序固定长度的字段优先
                               (5)组合索引代替多个单列索引(经常使用多个条件查询时)
                               (6)尽量使用短索引 (create index ix_title on tb(title(16));特殊的数据类型 text类型)
                               (7)使用连接(join)来代替子查询
                               (8)连表时注意条件类型需一致
                               (9)索引散列(重复少)不适用于建索引,例如:性别不合适
                    2.命中索引
                    3.正确使用索引
                    
                        注意事项:
                            - like '%xx'
                            select * from userinfo where name like '%al';
                        - 使用函数
                            select * from userinfo where reverse(name) = 'alex333';
                        - or
                            select * from userinfo where id = 1 or email = 'alex122@oldbody';
                            特别的:当or条件中有未建立索引的列才失效,以下会走索引
                                    select * from userinfo where id = 1 or name = 'alex1222';
                                    select * from userinfo where id = 1 or email = 'alex122@oldbody' and name = 'alex112'
                        - 类型不一致
                            如果列是字符串类型,传入条件是必须用引号引起来,不然...
                            select * from userinfo where name = 999;
                        - !=
                            select count(*) from userinfo where name != 'alex'
                            特别的:如果是主键,则还是会走索引
                                select count(*) from userinfo where id != 123
                        - >
                            select * from userinfo where name > 'alex'
                            特别的:如果是主键或索引是整数类型,则还是会走索引
                                select * from userinfo where id > 123
                                select * from userinfo where num > 123
                        - order by
                            select email from userinfo order by name desc;
                            当根据索引排序时候,选择的映射如果不是索引,则不走索引
                            特别的:如果对主键排序,则还是走索引:
                                select * from userinfo order by nid desc;
                         
                        - 组合索引最左前缀
                            如果组合索引为:(name,email)
                            name and email       -- 使用索引
                            name                 -- 使用索引
                            email                -- 不使用索引
                    对于创建索引,它是真实存在的,占用硬盘空间,尽量不要使用索引
                    
                    
                    
                    select * from big_data where id > 2000010 limit 10;
                    
                    
                    select * from (select * from big_data where id > 2000020 limit 30) as A order by id desc limit 10; 
                    
                    
                    
                    
                
            

猜你喜欢

转载自www.cnblogs.com/zzy7372/p/9810872.html