innoDB 与 MyISAM 引擎区别
索引实现方式不同
大表的常见优化手段
当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施。
- 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。即缩小需要查询的数据量。
- 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读。
- 垂直分区: 根据数据库里面数据表的相关性进行拆分。即把一张列比较多的表根据列的相关性拆分为多张表。
- 优点:可以使得行数据变小,简化表的结构。
- 缺点:
- 主键会出现冗余,需要管理冗余列,并会引起 Join 操作(可以通过在应用层进行Join来解决)。
- 垂直分区会让事务变得更加复杂。
- 水平分区: 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量。
- 水平拆分最好分库。水平拆分能够支持非常大的数据量存储,应用端改造也少,但分片事务难以解决 ,跨界点 Join 性能较差,逻辑复杂。
- 尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度。
limit 20000 如何优化
子查询优化法
先找出第一条数据,然后大于等于这条数据的 id 就是要获取的数据,要求数据连续,基本就是不能有 WHERE 语句了。
原始 SQL 语句:
select * from Member limit 10000,100优化后:
select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100使用 id 限定优化
这种方式假设数据表的 id 是连续递增的,则我们根据查询的页数和查询的记录数可以算出查询的 id 的范围,可以使用 id
between and 来查询。
原始 SQL 语句:
select * from orders_history where type=2 limit 100000,100优化后:
select * from orders_history where type=2 and id between 1000000 and 1000100 limit 100