MySQL

MySQL优化问题一:

场景:

有一个订单表,数据量千万级,其中有常见的订单状态status字段和创建时间create_time,有一个查询语句:

SELECT * FROM orders WHERE status = ? ORDER BY created_time DESC;

假设执行时间大约在十秒,需要优化。该怎么思考进行优化呢?

分析过程

1.条件:status = ? (等值查询)

2. 排序:created_time DESC (按创建时间倒序)

3.数据量:千万级

优化思路考量:

1.根据条件进行索引优化:为status和create_time建立复合索引。

由于status的实际含义可能为一些重复性的状态值,如果status的某个值特别多(如90%的订单都是已经完成的),那么及时有索引,查询也可能需要扫描很多行。这时可以考虑分区表或者分库分表

2. 分页优化:如果查询结果集很大,而且通常我们只需要前几页,那么分页的深度会影响性能(比如LIMIT 100000, 10)。对于深分页,我们可以使用“游标”或者“记录上次查询位置”的方法来优化。

3. 按需查询:避免SELECT *,只查询必要的字段,减少数据传输量。

4. 使用覆盖索引:如果查询的字段都在索引中,那么可以避免回表,提高速度。但这里SELECT *,所以很难用覆盖索引,除非索引包含所有字段(不现实)。所以可以权衡是否只查部分字段。

5. 读写分离:如果实时性要求不高,可以从读库查询。

6. 缓存:对于相同条件的查询,如果数据更新不频繁,可以考虑缓存结果

7.冷热分离:将历史数据存档,只保留近期数据(如三个月)在数据表。

你可能感兴趣的:(数据库,mysql,数据库)