sql索引失效的情况,以及优化方式。

目录

1. sql查验以及优化说明

2. 索引失效事例,以及优化方式

2.1 失效情况说明

2.2 例子以及优化方式

2.2.1 不使用索引列进行查询

2.2.2 使用函数或者表达式进行查询

2.2.3 对索引列进行类型转换

2.2.4 在索引列上进行计算

2.2.5 对索引列进行排序或者分组:

2.2.6 使用 NOT IN 或者 <> 进行查询:


1. sql查验以及优化说明

MySQL 是一种常用的关系型数据库管理系统,其 SQL 查询优化是提高数据库性能的关键之一。以下是一些常见的 MySQL SQL 优化技巧:

  1. 使用 EXPLAIN 查看 SQL 语句的执行计划。使用 EXPLAIN 可以查看 SQL 语句的执行计划,包括查询方式、索引使用情况、表扫描次数等信息,从而优化 SQL 语句。

  2. 使用索引。索引可以加速 SQL 查询,提高数据库性能。可以根据 SQL 查询的情况选择合适的索引类型,如普通索引、唯一索引、全文索引等。

  3. 避免使用 LIKE 查询。LIKE 查询通常需要扫描整张表,而且不能使用索引,因此性能较差。如果需要使用 LIKE 查询,可以使用全文索引或者将查询条件转换成范围查询。

  4. 避免在 WHERE 子句中使用函数。如果在 WHERE 子句中使用函数,MySQL 将会对每个记录都调用一次该函数,会导致较慢的查询速度。如果必须使用函数,可以考虑在查询之前先将函数的返回值保存到变量中。

  5. 避免使用 SELECT *。如果 SELECT *,MySQL 将会返回所有列的值,包括不需要的列。这会增加网络传输和内存开销,降低查询速度。应该只查询需要的列。

  6. 分页查询时使用 LIMIT。如果需要分页查询,应该使用 LIMIT 语句,而不是将所有记录返回然后在应用程序中分页。LIMIT 可以限制查询结果集的大小,提高查询速度。

  7. 避免使用子查询。子查询通常需要执行多次,性能较差。如果需要使用子查询,可以考虑将其转换成 JOIN 查询。

  8. 合理使用缓存。使用缓存可以避免频繁的 SQL 查询,提高查询速度。可以使用 MySQL 自带的缓存或者应用程序中的缓存。

总之,MySQL SQL 优化需要根据具体的应用场景进行合理的选择和实现。可以通过 EXPLAIN、索引优化、查询条件优化、缓存等技巧来提高查询速度和数据库性能。

2. 索引失效事例,以及优化方式

2.1 失效情况说明

MySQL 索引失效指的是索引无法被查询优化器使用,从而导致查询效率低下。下面列举了一些常见的导致索引失效的情况:

  1. 不使用索引列进行查询。如果查询条件中不包含索引列,MySQL 将无法使用索引。

  2. 使用函数或者表达式进行查询。如果在 WHERE 子句中使用函数或者表达式,MySQL 将无法使用索引。

  3. 对索引列进行类型转换。如果对索引列进行类型转换,MySQL 将无法使用索引。

  4. 在索引列上进行计算。如果在索引列上进行计算,MySQL 将无法使用索引。

  5. 对索引列进行排序或者分组。如果对索引列进行排序或者分组,MySQL 将无法使用索引。

  6. 使用 NOT IN 或者<>进行查询。如果使用 NOT IN 或者<> 进行查询,MySQL 将无法使用索引。

  7. 使用 LIKE 进行查询。如果使用 LIKE 进行查询,MySQL 将无法使用 B-Tree 索引,只能使用全文索引或者哈希索引。

  8. 隐式转换。如果在索引列上进行隐式转换,MySQL 将无法使用索引。

  9. 对多个列进行 OR 连接。如果对多个列进行 OR 连接,MySQL 可能无法使用索引。

  10. 数据量太大。如果数据量太大,MySQL 可能无法使用索引。

总之,要保证 MySQL 索引的有效性,需要注意查询条件中是否包含索引列,避免使用函数、表达式、计算、排序、分组、NOT IN、<>、LIKE、隐式转换、OR 连接等操作,以及注意数据量大小。如果遇到了索引失效的情况,可以通过分析查询计划、使用 FORCE INDEX 等方式来优化查询语句。

2.2 例子以及优化方式

2.2.1 不使用索引列进行查询

假设有一张学生表 student,其中有一个索引是 name_index,包含了学生的姓名信息。如果我们要查询某个班级的学生信息,但是查询条件不是学生姓名而是学生的班级信息,那么该查询将无法使用 name_index 索引:

SELECT * FROM student WHERE class = 'A';

优化方法是在 class 列上创建索引:

CREATE INDEX class_index ON student(class);

2.2.2 使用函数或者表达式进行查询

假设有一张订单表 order,其中有一个索引是 order_time_index,包含了订单的下单时间信息。如果我们要查询某一天的订单信息,但是查询条件需要将 order_time 这个时间戳转换为日期格式,那么该查询将无法使用 order_time_index 索引:

SELECT * FROM order WHERE DATE(order_time) = '2023-04-19';

优化方法是使用合适的数据类型存储 order_time,避免使用函数进行转换:

ALTER TABLE order MODIFY COLUMN order_time DATE;

2.2.3 对索引列进行类型转换

假设有一张订单表 order,其中有一个索引是 amount_index,包含了订单的金额信息。如果我们要查询金额大于 100 的订单,但是查询条件需要将 amount 这个字符串类型转换为数值类型,那么该查询将无法使用 amount_index 索引:

SELECT * FROM order WHERE CAST(amount AS UNSIGNED) > 100;

优化方法是在 amount 列上使用数值类型存储:

ALTER TABLE order MODIFY COLUMN amount DECIMAL(10, 2);

2.2.4 在索引列上进行计算

假设有一张商品表 product,其中有一个索引是 price_index,包含了商品的价格信息。如果我们要查询价格在某一范围内的商品信息,但是查询条件需要将价格进行加减运算,那么该查询将无法使用 price_index 索引:

SELECT * FROM product WHERE price + 10 BETWEEN 100 AND 200;

优化方法是将计算操作提前,将查询条件改写为:

SELECT * FROM product WHERE price BETWEEN 90 AND 190;

2.2.5 对索引列进行排序或者分组:

假设有一张订单表 order,其中有一个索引是 order_time_index,包含了订单的下单时间信息。如果我们要按照订单下单时间进行分组,那么该查询将无法使用 order_time_index 索引:

SELECT COUNT(*) FROM order GROUP BY DATE(order_time);

优化方法是创建新的索引以满足排序或分组需求:

CREATE INDEX order_time_date_index ON order(DATE(order_time));

2.2.6 使用 NOT IN 或者 <> 进行查询:

假设有一张学生表 student,其中有一个索引是 age_index,包含了学生的年龄信息。如果我们要查询年龄不在某个范围内的学生信息,但是查询条件使用了 NOT IN 或者 <>,那么该查询将无法使用 age_index 索引:

SELECT * FROM student WHERE age NOT IN (18, 19, 20);

优化方法是使用范围查询代替 NOT IN 或者 <>:

SELECT * FROM student WHERE age < 18 OR age > 20;

通过上述例子,我们可以看到在使用索引时需要注意的几个问题,包括不使用索引列进行查询、使用函数或者表达式进行查询、对索引列进行类型转换、在索引列上进行计算、对索引列进行排序或者分组以及使用 NOT IN 或者 <> 进行查询。对于这些问题,我们可以使用一些优化方法,如在适当的列上创建索引、使用合适的数据类型、对查询条件进行改写等等。

当然,这些只是一些常见的情况,实际情况还可能更加复杂。在实际的开发中,我们需要结合具体的查询场景进行优化,以获得更好的性能和效果。

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