在实际项目中,数据库查询经常出现响应过慢或超时情况。那么怎么减少慢查询的出现呢?首先可以从数据表设计角度出发去进行避免,可以从以下方面进行考虑:
合理设计表,可以减少慢查询的出现,但是并不能完全避免。本文将慢查询可分为一般慢查询、深度分页慢查询和数据量大导致的慢查询。
当出现一般慢查询时,可以按照以下步骤去进行 SQL 调优:
在分页查询时,经常出现页数越大,查询越慢的情况。
MySQL 实现分⻚查询通常使⽤ LIMIT 和 OFFSET ⼦句实现,LIMIT n 表示每⻚查询n条记录,OFFSET m表示从第m条记录开始查询。 当OFFSET 值较⼤时,MySQL 可能会选择执⾏全表扫描⽽不是使⽤索引。此外分页查询在使⽤⼆级索引时,需要通过索引回表到主键索引去检索完整的⾏数据,这也会使查询效率变慢。那么如何进行优化呢?
SELECT * FROM table_name WHERE id > [last_id] ORDER BY id LIMIT [page_size];
SELECT * FROM table_name WHERE id >= (
SELECT id FROM table_name WHERE column = 'value'
ORDER BY id DESC LIMIT 1 OFFSET [offset]
)
ORDER BY id ASC
LIMIT [page_size];
SELECT a.* FROM table_name a
INNER JOIN (
SELECT id FROM table_name
WHERE column = 'value'
ORDER BY id DESC
LIMIT [offset], [page_size]
) b ON a.id = b.id
在MySQL 中,单表数据量一般都限制在 2000w 以内,当超过后会出现严重性能问题。所以针对大表,可以进行⽔平分表。⽔平分表是⼀种将数据表按⼀定规则拆分为多个⼦表的技术。每个⼦表存储全表数据的⼀部分,所有⼦表共同组成完整的数据集。通过这种⽅式,可以减⼩单表的数据量,提⾼查询和操作的性能。水平分表一般可以按照以下几种策略进行:
具体采用何种分表策略,还需要结合自身业务特点进行评估。
分表有一个很重要的问题,就是分表ID⽣成策略应该如何设计。下面是几种生成策略以及其优缺点。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。