mysql基础5-索引及查询优化

索引就和书的目录一样,通过查看目录能够快速找到要查找内容,对于一个数据量较大的数据表来说,千万不要全表查询,一定要包含索引

索引失效的场景

其实加索引并不难,但是再表关联等的时候会出现索引失效的场景,可通过EXPLAIN查看执行过程,在增加了索引的情况下,typeALL的时候则索引失效。

这里简单写下此次优化过程中索引失效的一些场景:

对于一构建记录表,包含version

DROP TABLE IF EXISTS `t_record_info` ;

CREATE TABLE `t_record_info` (
  `name` VARCHAR(64) NOT NULL,
  `type` INT(2) NOT NULL,
  `version` VARCHAR(64) NOT NULL,
  `create_time` DATETIME NOT NULL,
  KEY `idx_create_time` (`create_time`),
  KEY `idx_version` (`version`)
);

INSERT INTO `t_record_info` VALUE ("a",0,"version1",'2020-12-01');
INSERT INTO `t_record_info` VALUE ("b",1,"version2",'2021-01-01');
INSERT INTO `t_record_info` VALUE ("b",0,"version1",'2021-02-01');

对于一version表

DROP TABLE IF EXISTS `t_version`;

CREATE TABLE `t_version` (
  `version_name` VARCHAR(64) NOT NULL,
  `depart` VARCHAR(64) NOT NULL,
  KEY `idx_version_name` (`version_name`),
  KEY `depart` (`depart`)
);

INSERT INTO `t_version` VALUE ("version1",'d1');
INSERT INTO `t_version` VALUE ("version2",'d1');
INSERT INTO `t_version` VALUE ("version3",'d2');
INSERT INTO `t_version` VALUE ("version4",'d2');
(1) 不等于,部分like(开头%开始)

尽量避免where的时候使用<> 或者 !=操作,因为mysql支持<, <=, > ,=, BETWEEN, IN等

  • 失效的场景
EXPLAIN SELECT * FROM t_record_info WHERE VERSION LIKE '%d%'
  • OK的场景
EXPLAIN SELECT * FROM t_record_info WHERE VERSION LIKE 'd%'
(2)IN子查询

当version进行in子查询的时候

EXPLAIN SELECT * FROM t_record_info 
WHERE VERSION IN (SELECT version_name FROM t_version WHERE depart = 'd1');

会发现t_record_info的version索引会失效,type会成ALL

解决策略

(1)使用exit代码

代码省略

(2)使用关联表

EXPLAIN SELECT * FROM t_record_info AS a 
LEFT JOIN t_version AS b
ON a.`version` = b.`version_name`
WHERE b.`depart` = 'd1';

(3)使用业务代码独立(采用)

查询两次,第二次的时候直接使用in的

SELECT version_name FROM t_version WHERE depart = 'd1'

业务代码先计算出version列表(也可以使用临时表进行存储),然后再查询

SELECT * FROM t_record_info WHERE VERSION IN ('version1','version2')

一些建议

(1)最左匹配原则

尽量把最常用的字段放在最前面

(2)尽量把离散值较高的字段往前放

(3) 查询时,有的列是非等值条件,有点是等值条件,则等值条件字段放在前面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值