Mysql索引

索引的概念

索引实际上是一种特殊的文件,在InnoDB中,索引是数据表空间的一部分。它里面存放着表中记录的指针,通俗点讲索引好比一本书的目录,方便快速查询。
索引分为聚簇索引和非聚簇索引,聚簇索引是按照数据存放位置为顺序,非聚簇索引则不然。聚簇索引可以提高多行检索的效率,非聚簇索引对于单行检索效率较高。
注意:索引以实际文件存在,如果索引创建过多,对于数据的更新影响较大,维护成本较高。对于需要进场插入和删除的数据表就没有必要创建索引,对于较小的表,也没必要创建索引。

索引的分类
  • 1、普通索引
    索引的创建:
//直接创建索引
mysql> create index deptno on dept(deptno);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
  • 2、唯一索引
    唯一索引与普通索引类似,只是唯一索引需要保证列值必须唯一(可以为空)。
    唯一索引的创建:
mysql> create index dname on dept(dname);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
  • 3、主键索引
    主键索引是为主键创建的索引,与唯一索引不同的是定义列的时候主键约束是primary而唯一索引定义的列约束是unique。主键索引的创建与唯一索引一样。
  • 4、复合索引
    一般我们对多个列进行查询的时候会使用复合索引。
    复合索引的创建:
mysql> create index dept_index on dept(dname,db_source);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意:复合索引遵循最左匹配原则。

  • 5、全文索引
    MySQL从3.23.23版开始支持全文索引和全文检索,全文索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
    文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。
      这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。
索引的优化

全值匹配(这是基本原则),最左前缀要遵行(联合索引一般都围绕最左前缀优化);

带头大哥活才行(联合索引从最左边字段开始使用),中间兄弟规矩行(不能跳过中间的字段,跳过后索引无效);

索引列上少计算(索引列上尽量不要进行计算),范围之后全完蛋(where后面使用范围查询的之后的索引无效);

like百分最右写(%号写最右边,写左边会导致索引失效),覆盖索引别写星(尽量避免select*这样的语句,能写索引列最好);

空值不等还有or,索引失效最无情(is null,is not null,!=,<>,or会导致索引无效);

关于索引优化原则,不同的sql版本会有不同,并且需要结合explain的各项参数分析,需要不断体会,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值