暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL查询优化

双鬼带单 2021-05-31
512

1. 查询优化

  • 1. 查询优化

    • 1.2.1. 使用关联查询优化

    • 1.2.2. 使用范围查询

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

    • 1.2. 优化 Limit 分页


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

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

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

复制

假设表 film
数据如下:

idnameprice
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
为主键并自增, name
varchar
且没有索引

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

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

复制

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

1.2. 优化 Limit 分页

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

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

复制

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

1.2.1. 使用关联查询优化

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

  1. SELECT

  2.    id, name, price

  3. FROM film

  4. INNER JOIN (

  5.    SELECT id

  6.    FROM film

  7.    LIMIT 10000 OFFSET 20

  8.    ) AS LIM USING(id)

复制

1.2.2. 使用范围查询

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

  1. SELECT id, name, price

  2. FROM film

  3. WHERE position BETWEEN 10000 AND 10020

  4. ORDER BY position

复制




喜欢就关注下哦!你的认可是我最大的动力。


文章转载自双鬼带单,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论