索引

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%"可以使用索引

原文地址:https://www.cnblogs.com/BrokenHeart/p/10616159.html