MySQL查询优化

1. 查询优化

  • 1. 查询优化
    • 1.2.1. 使用关联查询优化
    • 1.2.2. 使用范围查询
    • 1.1. 最大值和最小值的优化
    • 1.2. 优化 Limit 分页

1.1. 最大值和最小值的优化

对于 MIN()MAX() 查询, MySQL 的优化做的并不是太好,例如

select MIN(id) FROM film where name = '西游记';

假设表 film 数据如下:

id

name

price

1

英雄本色

12

2

哪吒传奇

14

3

西游记

34

4

水浒传

23

5

红楼梦

34

6

红与黑

2

7

红与黑

4

8

美人鱼

23

9

爸爸归来

23

10

我是谁

12

11

喜羊羊

56

12

西游记

67

其中 id 为主键并自增, namevarchar 且没有索引

因为 name 没有索引,因为 MySQL 将会进行一次全表扫描。因为 id 为自增,那么我们可以当作,第一次找到 name='西游记'时, id 就为我们想要的结果,此时我们可以改写 SQL 为:

select id FROM film where name = '西游记' limit 1;

此时当查到第一条记录时,就会停止继续查询,获得更高的性能。

1.2. 优化 Limit 分页

在系统进行分页操作的时候,当偏移量大时,例如: limit10000,10020 时, MySQL 需要查询 10020 条记录然后只返回 20 记录,前面的记录全部被舍弃,这样的代价非常高,

SELECT id, name, price FROM file LIMIT 10000 OFFSET 20

上面的 SQL 我想是分页常规的写法,写法没有什么错误,正如上面说到,浪费了大量的性能。

1.2.1. 使用关联查询优化

优化此类查询一个简单的方法就是尽可能地使用索引覆盖扫描,而不是查询所有的列,然后根据需要做一次关联操作再返回所需的列。对于偏移大的时候,这样做的效率提升非常大。

SELECT     id, name, price FROM film INNER JOIN (     SELECT id     FROM film     LIMIT 10000 OFFSET 20    ) AS LIM USING(id)

1.2.2. 使用范围查询

有时候可以将 LIMIT 转化为已知位置的查询,让 MySQL 通过范围扫描获得到对应的结果。例如,如果在一个位置列上有索引,并且预先计算出了边界值,则改写查询为:

SELECT id, name, price FROM film WHERE position BETWEEN 10000 AND 10020 ORDER BY position

原文发布于微信公众号 - 全栈布道士(gh_773193545262)

原文发表时间:2017-09-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据之美

一些sql用法例子【Updating】

1、利用instr连接表做字段查询,group_concat做值的合并: create table ab(product_id int,product_name...

29160
来自专栏Java帮帮-微信公众号-技术文章全总结

【数据库】MySQL进阶八、多表查询

【数据库】MySQL进阶八、多表查询 MySQL多表查询 一 使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 … WHERE ...

45940
来自专栏Python

表——完整约束性规则(键)

一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: primary key (PK) 标识该字段为该表的...

23170
来自专栏Python爬虫实战

MySQL 从零开始:06 数据检索

在第四节《表的增删改查》中已经介绍了 select 查询记录的几种使用方法:查询所有行的所有列、查询指定行的所有列、查询所有行的指定列和查询指定行的指定列。本文...

12230
来自专栏技术小站

(转)MySQL之char、varchar和text的设计

http://www.cnblogs.com/billyxp/p/3548540.html

13820
来自专栏个人随笔

sql sever分组查询和连接查询

分组查询 select 查询信息 from 表名 where 条件 group by 按照列分组(可多个 ,隔开) order by 排序方式 (查询信息如果列...

38050
来自专栏Java架构沉思录

8种常被忽视的SQL错误用法

分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time...

12230
来自专栏一个会写诗的程序员的博客

mysql 查看索引、添加索引、删除索引命令添加索引删除索引

· Table 表的名称。 · Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · S...

10010
来自专栏杨建荣的学习笔记

MySQL执行计划里面的key_len

以前看MySQL的执行计划,感觉内容有些简陋,平时分析主要就是看是否全表扫描,索引使用是否合理等。基本上也能分析出很多问题来,但是显然有时候会有些疑惑,那就...

37160
来自专栏Ryan Miao

mysql数据库去重复

参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单。...

410110

扫码关注云+社区

领取腾讯云代金券