🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
索引的目的在于提高查询效率. 索引的类型: * UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值 * INDEX(普通索引):允许出现相同的索引内容 * PROMARY KEY(主键索引):不允许出现相同的值 * fulltext index(全文索引):可以针对值中的某个单词,但效率确实不敢恭维 * 组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一 索引虽然好处很多,但过多的使用索引可能带来相反的问题,索引也是有缺点的: * 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT,UPDATE和DELETE。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件. * 建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在要给大表上建了多种组合索引,索引文件会膨胀很宽, 索引只是提高效率的一个方式,如果mysql有大数据量的表,就要花时间研究建立最优的索引,或优化查询语句。 使用索引时,有一些技巧: * 索引不会包含有NULL的列 只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。 * 使用短索引 对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。 * 索引列排序 mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。 * like语句操作 一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。`like ‘%aaa%’`不会使用索引,而`like ‘aaa%’`可以使用索引。 * 不要在列上进行运算 * 不使用`NOT IN`、`<>`、`!=`操作,但`<`,`<=`,`=`,`>`,`>=`,BETWEEN,IN是可以用到索引的 * 索引要建立在经常进行select操作的字段上。 这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 * 索引要建立在值比较唯一的字段上。 * 对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。 * 在where和join中出现的列需要建立索引。 * where的查询条件里有不等号(where column != …),mysql将无法使用索引。 * 如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。 * 在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。 组合索引的作用: 1. 减少开销。 建一个组合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。 对于大量数据的表,使用组合索引会大大的减少开销。 2. 覆盖索引。 通常指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 对组合索引(col1,col2,col3),如果有如下的`sql: select col1,col2,col3 from test where col1=1 and col2=2`。 那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。 所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。 3. 效率高。 索引列越多,通过索引筛选出的数据越快。