zoukankan      html  css  js  c++  java
  • 索引

    1、索引是什么

      索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
      可以理解为“排好序的快速查找数据结构”
      在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,
    这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
    打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

    2、优势

      类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本。
      通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

    3、劣势

      实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。
      虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。
      因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。
    都会调整因为更新所带来的键值变化后的索引信息。 
    建立索引会占用磁盘空间的索引文件。

    4、索引的分类

      主键索引、唯一索引、普通索引、全文索引、组合索引

    5、基本语法

    1,INDEX(普通索引):

    ALTER TABLE 'table_name' ADD INDEX index_name('col')

    最基本的索引,没有任何限制

    2,UNIQUE(唯一索引):

    ALTER TABLE 'table_name' ADD UNIQUE('col')

    与“普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。

    3,PRIMARY KEY(主键索引):

    ALTER TABLE 'table_name' ADD PRIMARY KEY('col')

    是一种特殊的唯一索引,不允许有空值。
    4,FULLTEXT(全文索引):

    ALTER TABLE 'table_name' ADD FULLTEXT('col')

    仅可用于MyISAM和InoDB,针对较大的数据,生成全文索引很耗时耗空间
    5,组合索引:

    ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3')

    为了更多的提高mysql效率可建立组合索引,遵循“最左前缀”原则。创建复合索引应该将最常用(频率)做限制条件的列放在最左边,一次递减。组合索引最左字段用in是可以用到索引的。相当于建立了col1,col1col2,col1col2col3三个索引
    修改索引名称(mysql)
    对于MySQL 5.7及以上版本,可以执行以下命令:

    ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

    对于MySQL 5.7以前的版本,可以执行下面两个命令:

    ALTER TABLE tbl_name DROP INDEX old_index_name

    ALTER TABLE tbl_name ADD INDEX new_index_name(column_name)

        
    6、哪些情况需要创建索引
        ①主键自动建立唯一索引
        ②频繁作为查询条件的字段应该创建索引
        ③查询中与其他表关联的字段,外键关系建立索引
        ④频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
        ⑤WHERE条件里用不到的字段不创建索引
        ⑥单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
        ⑦查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
        ⑧查询中统计或者分组字段
    7、哪些情况不要创建索引
      ①表记录太少
      ②经常增删改的表
        提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE、和DELETE。
        因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
        数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据建立索引。
      ③注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。

    索引使用注意事项

    1,不要滥用索引

    ①,索引提高查询速度,却会降低更新表的速度,因为更新表时,mysql不仅要更新数据,保存数据,还要更新索引,保存索引
    ②,索引会占用磁盘空间

    2,索引不会包含含有NULL值的列

    复合索引只要有一列含有NULL值,那么这一列对于此符合索引就是无效的,因此我们在设计数据库设计时不要让字段的默认值为NULL。

    3,MySQL查询只是用一个索引

    如果where字句中使用了索引的话,那么order by中的列是不会使用索引的

    4,like

    like '%aaa%'不会使用索引而like "aaa%"可以使用索引

  • 相关阅读:
    mysql不停库不锁表在线主从配置
    MySQL5.7不停机不锁表主从同步实战
    另类 k8s 集群灾难恢复方法:用 master 服务器镜像恢复出新集群
    我在新西兰卖挖掘机之续篇十八------坚持的秘诀(坚持的秘诀就2条,第一是初始摩擦力要足够小(开头不能太困难,时间不能太久);第二是坚持的事情能够不断地给你提供某种真实的好处)(其实就是正反馈,加上一点点兴趣)
    分布式系统中那些不靠谱任务-CAP 到底是什么
    分布式系统架构中关于切分数据库事务的 ACID 性质的可用性与性能-BASE 理论和CAP 定理
    SSO协议-SAML和OAuth2
    领域建模
    基于 Docker 容器Net Core微服务部署 Nginx 集群架构
    消息队列和分布式锁
  • 原文地址:https://www.cnblogs.com/dream98/p/10735985.html
Copyright © 2011-2022 走看看