MySQL 中的查询优化对于提高数据库性能至关重要,尤其是在处理大型数据集时

1. 使用适当的索引

  • 索引通过减少扫描的数据量来加快数据检索速度
  • SELECT * FROM employees WHERE last_name = 'Smith';
  • 如果您多次查询表的单个列,则为该列创建索引
  • 如果您或您的应用程序根据条件需要来自多列的数据,则创建复合索引
  • 2.避免使用 SELECT *

  • 只选择那些需要的列,如果你选择所有不需要的列,这只会消耗更多的服务器内存,并导致服务器在高负载或频率时间变慢
  • 例如,您的表包含 created_at 、 updated_At 和 timesptamps 等列,然后避免选择 *,因为在正常情况下不需要它们

    查询效率低下

    SELECT * FROM orders WHERE order_date > '2023-01-01';

    优化查询

    SELECT order_id, customer_id FROM orders WHERE order_date > '2023-01-01';
  • 优化连接
  • 确保 JOIN 条件中使用的列上有索引。
  • 如果你要连接具有主键的表,则无需创建,因为主键已经是一个索引

    SELECT orders.order_id, customers.name FROM orders
    JOIN customers ON orders.customer_id = customers.id
    WHERE customers.country = 'USA';

    在上面的查询中,orders.customer_id 需要被索引,并且它是来自另一个表的关系

    customers.id 是客户表的主键,因此无需创建索引

    customers.country 需要被索引,因为这是一个条件

    5. 避免使用子查询,使用连接代替

    6.使用查询缓存

  • 如果您的查询结果不经常改变,请使用 MySQL 的查询缓存。
  • 例如用户和订单列表以及其他不经常变化的内容

    7. 对大表进行分区

    CREATE TABLE orders (
        order_id INT NOT NULL,
        order_date DATE NOT NULL,
        ...
        PRIMARY KEY (order_id, order_date)
    )
    PARTITION BY RANGE (YEAR(order_date)) (
        PARTITION p0 VALUES LESS THAN (2000),
        PARTITION p1 VALUES LESS THAN (2010),
        PARTITION p2 VALUES LESS THAN (2020),
        PARTITION p3 VALUES LESS THAN MAXVALUE
    );