• MySQL索引


    什么是索引?

    排好序快速查找的数据结构就是索引

    索引作用

    提高检索效率,降低数据库对IO成本;降低数据排序,减少cpu消耗

    索引类型

    单值索引:一个索引包含单个列,一个表可以有多个单值索引
    
    唯一索引:索引值必须唯一,但允许有空值
    
    复合索引:一个索引包含多个列

    基本语法

    创建索引
    
    CREATE [UNIQUE](唯一) INDEX  indexname(索引名称) ON tablename(表名) (columnname(length)字段和类型)  
    
    该命令可以添加普通索引或唯一索引[UNIQUE]
    
    或者
    
    ALTER TABLE tablename ADD PRIMARY KEY (columnname_list)                          ---主键索引
    
    ALTER TABLE tablename ADD  INDEX  UNIQUE  indename(columnname_list)     ---唯一索引
    
    ALTER TABLE tablename ADD  INDEX  indename(columnname_list)                      ---普通索引
    
    ALTER TABLE tablename ADD  INDEX  FULLTEXT indename(columnname_list)   ---全文索引
    
    删除索引
    
    DROP INDEX [indexname]  ON table
    
    查看索引
    
    SHOW INDEX FROM  table 

    那些情况需要创建索引

    主键自动创建索引
    频繁作为查询条件的字段
    连表关联的字段,外键关系创建索引
    高并发下创建复合索引
    where字段
    排序的字段
    查询中统计或分组的字段
    如果表记录太少,经常增删改的表,某列字段重复数据较多就不要建立索引

    索引优化

    1.索引有多列时,遵循左前法则;顺序从左开始且不要跳过中间的索引,否则索引失效全盘扫描(带头大哥不能死,中间兄弟不能断)
    3.不要再索引列上做任何操作,包括计算、函数、自动或者手动类型转换,否则导致索引失效(索引列上无计算)
    4.范围条件查询之后的索引全部失效,使用范围查询时,有时会使用索引,有时会失效,这是因为使用范围条件的数据量有一定的范围(范围之后全失效)
    5.索引列尽量和查询列一致,减少select *
    6.使用“<>”或“!=”导致索引失效
    7.is null,is not null也会导致索引失效
    8.like的“%”在右边不会导致索引失效;查询的列匹配索引列,使用like ‘%xxx%’索引不会失效(like%加右边)
    9.字符串不加单引号或导致索引失效(字符串里有引号)
    10.or用来连接时导致索引失效,但是可以把or用union all代替

    关联查询优化

    保证被驱动表的join字段已经被索引
    left join 时,选择小表作为驱动表,大表作为被驱动表
    inner join 时,mysql会自己帮你把小结果集的表选为驱动表
    子查询尽量不要放在被驱动表,有可能使用不到索引

    子查询优化

    在使用"in"时,用大表驱动小表,"exists"时用小表驱动大表

    order by关键字优化

    ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序
    尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀
    where子句中如果出现索引的范围查询(即explain中出现range)会导致order
    by 索引失效。

    group by关键字优化

    group by实质是先排序后进行分组,遵照索引建的最佳左前缀
    where高于having,能写在where限定的条件就不要去having限定了。
    当无法使用索引列,增大max_length_for_sort_data参数的设置
    +增大sort_buffer_size参数的设置
    尽量不要使用
    distinct,可以考虑分组去重
  • 相关阅读:
    数据结构之链表
    非常好的Java反射例子
    return和finally的执行和联系
    struts2中的OGNL详解
    解耦与耦合的你我他
    struts2案例
    《使用Hibernate开发租房系统》内部测试笔试题
    一对多双向关联关系
    Oracle基本数据类型
    transactionManager的type与dataSource的type
  • 原文地址:https://www.cnblogs.com/-zzc/p/13618841.html
Copyright © 2020-2023  润新知