MySql索引使用

索引类型

# 主键索引:PRIMARY 
	这设立主键后数据库自动建立索引,InnoDB为聚簇索引,主键索引列不能为空(NUll);
# 唯一索引:UNIQUE
	索引列的值必须唯一。可以为空值,但是必须只有一个;
# 普通索引(组合索引):NORMAL
	也称为非唯一索引,允许重复值和NULL值。
	一个索引可以包含多个列,多个列共同组成一个复杂的索引;
# 全文索引:FULLTEXT
	Full Text(MySQL5.7之前,只有MYISAM存储引擎引擎支持全文索引)。
	全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找允许在这些索引列中插入重复值和空值。全文索引可以在Char、VarChar 上创建;
# 空间索引:SPATIAL
	MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型,MySQL在空间索引这方年遵循OpenGIS几何数据模型规则。
	空间索引用于支持空间数据的存储和查询,如地理位置信息的检索。
# 前缀索引: PREFIX
	在文本类型为char、varchar、text类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

查看表索引

SHOW INDEX FROM  表名;

结果解析

Table: 表示索引所属的表名;
Non_unique: 表示索引是允许重复值。0:表示索引是唯一的,不允许重复值;1:表示索引允许重复值;
Key_name:表示索引的名称;
Seq_in_index: 表示索引中的列的顺序。该值从1开始递增;
Column_name: 表示索引中的列名;
Collation: 表示索引的排序规则;A:代表ASCII排序规则,也称为字典顺序;其他规则
utf8_general_ci:UTF-8编码的不区分大小写,根据通用排序规则进行排序;
utf8_bin:UTF-8编码的区分大小写,根据二进制值进行排序;
utf8_unicode_ci:UTF-8编码的不区分大小写,根据Unicode排序规则进行排序;
latin1_swedish_ci:Latin1编码的不区分大小写,根据瑞典语排序规则进行排序;
latin1_bin:Latin1编码的区分大小写,根据二进制值进行排序;
Cardinality: 表示索引的基数,即索引中唯一值的数量估计;
Sub_part: 表示索引的子部分长度。如果整个列都被索引,则该值为NULL;
Packed:表示索引是否使用了压缩。如果值为NULL,则表示没有使用压缩。
Null:表示索引中的列是否允许NULL值。如果只为YES,则表示允许NULL值;如果值为NO,表示不允许NULL值;
Index_type: 表示索引类型,BTREE:B树。HASH;
Comment:表示对索引的注释或其他额外信息;

查看SQL语句使用的索引情况

EXPLAIN   SQL查询语句;

结果解析

id:表示查询的序列号,如果查询包含子查询,则子查询的ID值会大于父查询;
select_type:表示查询的类型,常见的类型有:
SIMPLE:简单SELECT查询,不包含子查询或UNION查询。
PRIMARY:外层查询。
SUBQUERY:子查询中的第一个SELECT。
DFRICED:派生表或视图中的子查询。
UNION:UNION 查询中的第二个及后续的SELECT。
table:表示查询的表名。
type:表示访问表的方式,常见的类型有:
const:使用常量进行查询,通常出现只有一个匹配行的查询条件中。
eq_ref:使用唯一索引进行链接,对于每个索引键值,只有一条匹配记录。
ref:使用非唯一索引进行查询,对于每个索引键值,可能会有多条匹配记录。
range:使用索引范围进行查询,常见于使用BETWEEN或IN等范围条件的查询。
index:扫描全索引进行查询,通常发生在覆盖索引的查询。
all:全表扫描,需要遍历整个表。
possible_keys:表示可能应用的索引。
partitlons:表示查询的分区信息
key:表示实际使用的索引。
key_len:表示使用的索引长度。
ref: 表示使用的索引列与查询条件之间的比较。
rows:表示扫描的行数,估计值。
filtered:表示根据WHERE条件过滤的行数的百分比。
Extra:提供关于查询执行的额外信息,包括使用的索引,排序方式,使用临时表等。

索引优先级

主键索引(PRIMARY) > 唯一索引(UNIQUE) > 普通索引(NORMAL)
当一条sql语句中有使用到多个索引只会生效一个索引;
当一条sql语句中有两个NORMAL索引时生效先创建的索引,即使 ‘后创建的索引’在WHERE的条件中先与’先创建的索引‘;

在 MySQL 中,索引的优先级是根据查询优化器的选择逻辑来确定的,它会根据查询的复杂性、表的大小和索引的统计信息等因素来评估索引的使用。通常情况下,优化器会尽量选择最适合的索引来执行查询。然而,索引的优先级一般按照以下原则确定:
1,精确匹配索引:如果查询条件中包含了与某个列完全匹配的条件,并且这个列上存在索引,那么优化器会优先选择该索引。这是因为精确匹配的索引可以快速地定位到符合条件的行。
2,范围匹配索引:如果查询条件中包含了针对某个列的范围查询(如大于、小于、区间等),并且这个列上存在索引,那么优化器有可能会选择该索引来执行查询。
3,复合索引:如果查询条件中包含了多个列的条件,并且这些列上存在复合索引,那么优化器有可能会选择这个复合索引来执行查询。复合索引可用于多个列的匹配和范围查询,但索引的顺序非常重要。优化器会尝试选择最适合的索引。
4,统计信息:优化器还会参考表和索引的统计信息来评估索引的选择。这些统计信息包括每个索引的唯一值数量、每个索引的平均行长度等。通过分析这些统计信息,优化器可以更好地评估索引的选择。

索引设置规范

主键索引:pk_字段名;
唯一索引:uk_字段名;
普通索引:inx_字段名;

索引设计和优化

1,避免过度索引:虽然索引可以提高查询性能,但它们也会占用存储空间,并可能降低写操作的性能(如INSERT、UPDATE和DELETE)。因此,应该只为那些经常用于搜索、排序和连接的列创建索引。尽量在5个索引内。
2,主键索引:主键是一种特殊的索引,它唯一标识表中的每一行。主键索引通常是自动创建的,并且包含在主键列中。因此,当你定义一个主键时,你实际上已经为该列创建了一个索引。
3,复合索引:如果你经常按多个列进行查询,可以考虑创建复合索引(多列索引)。但是,复合索引的列顺序很重要,因为它会影响索引的效率。你应该将最常用于查询条件的列放在前面。
4,选择适当的索引类型:不同的数据库管理系统提供了不同类型的索引(如B-tree、Hash、Bitmap等)。你应该根据具体的使用场景和数据库管理系统的建议来选择合适的索引类型。
5,定期审查和优化索引:随着数据的变化和查询需求的变化,你可能需要调整或删除一些不再需要的索引。定期审查和优化索引可以确保数据库的性能保持在最佳状态。

NORMAL复合索引的使用

MySQL 引擎在执行查询时,为了更好地利用索引,在查询过程中会动态调整查询字段的顺序!(也就是说,当条件中的字段全部达到复合索引中的字段时,可以动态调整字段顺序,使其满足最前左缀)
假如创建的复合索引为三个字段,按顺序分别是(name,age,sex)

#可以使用复合索引:索引中包含的字段数都有,只是顺序不正确,在执行的时候可以动态调整为最前左缀
select * from user where sex = ? and age = ? and name = ?
select * from user where age = ? and sex = ? and name = ?

#不可以使用复合索引:因为缺少字段,并且顺序不正确
select * from user where sex = ? and age = ?
select * from user where age = ? and name = ?
select * from user where age = ?
select * from user where sex = ?

FULLTEXT的创建与使用

在MySQL 5.5版本中,使用BTREE作为FULLTEXT索引的存储引擎是不支持的,需要确保表内的text_long字段已经设置了合适的字符集和不可为空的约束。
从MySQL 5.6开始,InnoDB存储引擎也支持FULLTEXT索引。
只有MyISAM存储引擎支持FULLTEXT索引。如果你的表是使用MyISAM引擎。 也就是不选择索引方式
ALTER TABLE tian.ts_test
ADD FULLTEXT(text_long);
5.5.30版本好像使用不了FULLTEXT

索引失效

1,使用函数或表达式:如果在查询条件中对索引列使用函数或表达式,例如 WHERE DATE_FORMAT(create_time, ‘%Y-%m-%d’) = ‘2022-06-06’,这样会导致索引失效,因为无法再函数或表达式上使用索引。
2,使用通配符前缀:如果在查询条件中使用通配符前缀,如 WHERE name LIKE ‘%abc’,这种情况下 MySQL 无法利用索引,因为通配符在索引列的开头。
3,对索引列进行类型转换:如果在查询条件对索引列进行类型转换,例如 WHERE CAST(age AS CHAR) = ‘30’,这样会导致索引失效。
4,左连接的查询条件:对于左连接中右表的条件,如果不在 ON 子句中指定,并且在 WHERE 子句中使用,这种情况下索引可能会失效。

你可能感兴趣的:(mysql,数据库)