索引
普通索引:最基本的索引,没有任何约束限制
唯一索引:与普通类似,但是具有唯一性
主键索引:特殊的唯一索引,不允许空值
- 主键索引与唯一索引的区别
- 一个表只能有一个主键索引,可以有多个唯一索引
- 主键索引一定是唯一索引,唯一索引不是主键索引
- 主键可以与外键构成参照完整性约束,防止数据不一致
复合索引:将多个列组合在一起创建索引,可以覆盖多个列
- 解释:A村有8组 给A村创建索引 但是需要查询的是A村1组 会找到A村索引后轮训8组 耗费时间 所以建议给8组每组建立索引
外键索引:只有Innodb类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作
全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索
关于索引的使用小技巧,避免对于整个索引的轮训,可以指定单个索引供以查询使用
-
强制索引: Force Index 【FORCE INDEX】
- 示例:sel * from table force index (field1)
- 注解:只是用在field1上的索引 不使用其他字段上的索引
-
忽略索引:Ignore Index 【IGNORE INDEX】
- 示例:sel * from table IGNORE INDEX (field1, field2, ...) 注解:不使用field1 与 fields 上的索引
-
关闭/打开查询缓冲 SQL_ON_CACHE / SQL_CACHE
-
Tips:
- 查询缓冲是SQL文本和查询结果的映射。如果第二次查询的SQL和第一次
- 查询的SQL完全相同(注意必须是完全相同,即使多一个空格或者大小写不同都认为不同)
- 且开启了查询缓存,那么第二次查询就直接从查询缓存中取结果。
-
示例:
- sel SQL_NO_CACHE field1, field2, from table;
- SQL_CACHE field1 field2, from table;
-
MySQL索引的创建原则
- 原则
- 最适合索引的列是出现在WHERE子句中的列,或连接自句中的列而不是出现在SELECT关键字后的列
- 索引列的基数越大,索引的效果越好
- 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
- 根据情况创建复合索引,复合索引可以提高查询效率
- 避免创建过多的索引,索引会额外占用磁盘空间,降低写操作的效率
- 主键尽可能的选择较短的数据类型,可以有效的减少索引的磁盘占用提高查询效率
MySQL索引的注意事项
- 注意
- 复合索引遵循前缀原则
MySQL查询缓冲
-
查询缓存可以看做是SQL文本和查询结果的映射。如果第二次查询的SQL和第一次查询的SQL完全相同(注意必须是完全相同,即使多一个空格或者大小写不同都认为不同)且开启了查询缓存,那么第二次查询就直接从查询缓存中取结果。
-
缓存数据失效时机 :在表的结构或数据发生改变时,查询缓存中的数据不再有效。
- 有这些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据失效。
- 所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用。