文章最初发表于公众号:程序员周先森。本平台不定期更新,喜欢我的文章,请关注我的微信公众号。我们都知道数据库索引可以帮助我们更快的找到匹配的数据,但是如果不使用索引,Mysql会从第一项开始查询,直到找到匹配的数据,这也会造成一个问题:如果有没有加索引,如果表中的数据很大,查询数据会耗费更多的时间。这时候我们给字段加上索引,Mysql会快速的查找数据,可以节省很多时间。MyISAM和InnoDB是最常用的两个存储引擎。MyISAM和InnoDB索引都使用B+树数据结构。B树和B+树有什么区别?B-treeB-tree是一种多路搜索树。查找时,从根节点开始,对节点中有序的关键字进行二分查找。如果命中,则搜索结束。否则,根据搜索大小进入左右子节点,重复搜索,直到找到搜索结果。特点:关键字分布在B树的所有节点中。关键字在多个节点中不重复。搜索可能会在非叶节点处结束。B+树B+树其实是一种特殊的B树。与B树最明显的区别是B+树的关键字只会出现在叶子节点中,关键字在链表中是有序的。即B+树的查找最后只会命中叶子节点中的结果,那么非叶子节点在B+树中起到什么作用呢?非叶子节点相当于B+树中叶子节点的索引,叶子节点是存储关键数据的数据层。由于Mysql索引采用了B+树的数据结构,与B树相比,B+树作为索引的优势是什么:磁盘读写成本更低。查询效率更稳定。遍历元素是高效的。说完B-tree和B+-tree的概念,就要开始说索引了。Mysql索引其实有两种数据结构:B+树和Hash。但是,在MyISAM和InnoDB存储引擎中只能使用B+树。其实索引可以分为四类:单列索引:单列索引有普通索引、唯一索引、主键索引、复合索引、全文索引、空间索引、单列索引三种。索引,单列索引,顾名思义,一个索引只能作用于单个列,但是一个数据表可以同时有多个单列索引。单列索引分为三种类型:普通索引、唯一索引和主键索引。普通索引:基本索引类型,不会对数据做任何限制。它还允许普通索引添加的普通索引的数据列中有空值或重复值。添加普通索引的目的只是为了更快地查询数据。唯一索引:为单个列添加唯一索引意味着该列只能有唯一值。例如,可以在user表中为用户名添加唯一索引,使用户名必须是唯一值,但可以为null。主键索引:其实就是基于唯一索引,列中是不允许空值存在的。复合索引是选择数据表的多列组合,然后创建索引,但是复合索引并不是说创建成功就可以使用,而是需要跟在最左边的前缀集后面。即只有在查询条件中使用了这些字段的左字段时,复合索引才会生效。下面举个例子来解释一下什么叫最左前缀。先建表test_10_09,将id、username、sex三列合并起来,然后加索引。CREATETABLEtest_10_09(idINTNOTNULL,usernameVARCHAR(20)NOTNULL,idcardVARCHAR(18),sexVARCHAR(3)NOTNULL,INDEXMultiIdx(id,username,sex))我们说组合索引需要满足最左边的前缀。那么最左边的前缀是什么?最左边的前缀实际上是使用复合索引中最左边的列来匹配数据。从上面的例子我们可以看出,复合索引最左边的列是id,所以如果查询条件中不包含id,则不满足前缀最左边的原则,此时查询操作不能使用我们创建的复合索引。我们可以使用EXPLAIN命令来测试查询条件带id和不带id的效果:可以看到带id的查询可以通过索引查询,但是不带id的查询不能触发最左前缀原则,所以复合索引确实不生效。全文索引全文索引其实就是字面意思。使用全文索引,可以在一系列文本中通过某个关键字找到包含该字段的记录行。但是全文索引有很多限制:在InnoDB存储引擎中不支持,只允许在MyISAM存储引擎中使用。全文索引只能用于三种类型的数据列:char、varchar和text。默认情况下,搜索的关键字必须至少有4个字符。全局索引使用MATCH函数。空间索引mysql5.7开始支持空间索引。空间索引一般适用于涉及空间操作的系统,比如游戏开发。空间索引只能用于四种空间数据类型的数据列:GEOMETRY、POINT、LINESTRING和POLYGON。并且添加空间索引的数据列必须是非空的。创建空间索引时必须使用SPATIAL关键字。索引优点数据表中的所有数据列都可以被索引。使用唯一索引或主键索引来保证数据的唯一性。使用索引可以提高查询数据的效率和性能。索引缺点使用索引会占用一定的物理空间。数据的插入和修改需要维护索引,会影响性能。索引使用原则对于经常需要插入或更新的表,不宜设置过多的索引,因为数据的插入和修改需要维护索引,会影响性能。不建议对数据量小的表添加索引,否则可能会降低查询效率和性能。当列的取值范围比较小时,不使用索引。比如专业名称只有三个值,使用索引真的没有意义。复合索引将使用频率最高的列放在第一列,保证复合索引能满足最左前缀的要求。如果列的值是唯一的,可以在该字段上添加唯一索引,提高查询效率。尽量在数据量较小的列上加索引。比如varchar(100)的检索效率肯定没有varchar(30)快,所以在数据量大的列上加索引会降低查询效率。欢迎关注公众号:程序员周先森。文章原发于微信公众号,本平台不定时更新。
