详解 MySQL 30 条军规
军规 1:避免在列上使用函数或表达式
在查询的 SELECT 语句中,应避免使用函数或表达式作用于列。例如,避免使用如下语句:
SELECT AVG(product_price) FROM products;
查询中使用了 AVG 函数,会对表中的每一条记录进行求平均值的运算,应该修改为:
SELECT product_avg_price FROM product_summary;
product_avg_price 是在 product_summary 表中预先计算好的平均值。
军规 2:避免在列上使用“select *”
在 SELECT 语句中,应该避免使用 SELECT *。如果表中列的数量非常多,查询的性能会受到很大影响。应该明确的指定需要的列,例如:
SELECT name, address, email FROM customers;
军规 3:避免在WHERE、JOIN、ORDER BY、GROUP BY等操作中使用“select *”
与军规 2 类似,应该避免在 WHERE、JOIN、ORDER BY、GROUP BY 等操作中使用 SELECT *。应该明确指定需要的列。
军规 4:使用JOIN方式替代WHERE子句中的子查询
在查询中,应该尽量使用 JOIN 语句来替代 WHERE 子句中的子查询。例如:
SELECT customers.*, orders.*
FROM customers
WHERE customers.customer_id IN (SELECT customer_id FROM orders);
应该修改为:
SELECT customers.*, orders.*
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;
军规 5:为常用的查询添加索引
通常情况下,可以通过添加索引来提高查询的性能。对于一些常用的查询,应该优先添加索引。例如:
SELECT * FROM customers WHERE email = 'john@example.com';
应该为 email 列添加索引。
军规 6:避免使用SELECT DISTINCT
在查询中,应该避免使用 SELECT DISTINCT。这会导致 MySQL 需要去除重复的记录,影响查询性能。可以使用 GROUP BY 来代替,例如:
SELECT customer_id FROM orders GROUP BY customer_id;
军规 7:避免使用ORDER BY RAND()
在查询中,应尽量避免使用 ORDER BY RAND()。这会导致 MySQL 需要对整张表进行排序,影响查询性能。可以使用其他方法来替代,例如:
SELECT * FROM products ORDER BY product_id DESC LIMIT 10;
军规 8:避免在WHERE中使用!=或NOT
在 WHERE 子句中,应该避免使用 != 或 NOT,可以使用其他方法代替。例如:
SELECT * FROM products WHERE product_type != 'book';
应该修改为:
SELECT * FROM products WHERE NOT product_type = 'book';
军规 9:避免在WHERE中使用<>或NOT
与军规 8 类似,应该避免在 WHERE 子句中使用 <> 或 NOT。应该使用其他方法代替。
军规 10:避免在LIKE的开头使用%
在查询中,应该避免在 LIKE 的开头使用 %。这会导致 MySQL 无法使用索引进行优化查询,影响查询性能。例如:
SELECT * FROM products WHERE product_name LIKE '%book%';
应该修改为:
SELECT * FROM products WHERE product_name LIKE 'book%';
军规 11:避免使用负向查询
在查询中,应该避免使用负向查询。例如:
SELECT * FROM products WHERE product_type <> 'book';
应该修改为:
SELECT * FROM products WHERE product_type = 'cd' OR product_type = 'dvd';
军规 12:避免在LIKE中使用_
在查询中,应该避免在 LIKE 中使用 _。这会导致 MySQL 无法使用索引进行优化查询,影响查询性能。例如:
SELECT * FROM products WHERE product_name LIKE '__book%';
应该修改为:
SELECT * FROM products WHERE product_name LIKE 'abook%';
军规 13:使用整数类型存储IP地址
在存储 IP 地址时,应该使用整数类型来存储。这会提高查询的速度,例如:
SELECT * FROM users WHERE ip_address = INET_ATON('127.0.0.1');
军规 14:使用EXISTS代替IN
在查询中,应该尽量使用 EXISTS 来代替 IN。例如:
SELECT * FROM products WHERE product_id IN (SELECT product_id FROM product_orders);
应该修改为:
SELECT * FROM products WHERE EXISTS (SELECT * FROM product_orders WHERE product_orders.product_id = products.product_id);
军规 15:避免使用HAVING
在查询中,应该尽量避免使用 HAVING。可以使用 WHERE 语句来代替,例如:
SELECT customer_id, COUNT(*)
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 1;
应该修改为:
SELECT customer_id, COUNT(*)
FROM orders
WHERE status = 'completed'
GROUP BY customer_id
HAVING COUNT(*) > 1;
军规 16:使用日期类型存储时间
在存储时间时,应该使用日期类型来存储。这会提高查询的速度,例如:
SELECT * FROM orders WHERE order_date = '2019-05-01';
军规 17:避免使用ENUM类型
在设计表时,应该尽量避免使用 ENUM 类型。这会导致查询变得复杂,不利于优化查询性能。
军规 18:避免在SELECT语句中使用时间函数
在查询中,应该避免在 SELECT 语句中使用时间函数。这会导致 MySQL 需要计算时间函数,影响查询性能。应该预先计算好时间函数,例如:
SELECT *, NOW() AS current_time FROM orders;
军规 19:在DELETE语句中使用LIMIT
在 DELETE 语句中,应该使用 LIMIT 来限制删除的条数,避免误删除所有数据。例如:
DELETE FROM orders WHERE order_date < '2019-01-01' LIMIT 1000;
军规 20:使用外键约束保证数据一致性
在设计数据库时,应该使用外键约束来保证数据的一致性。例如:
CREATE TABLE orders (
order_id INT,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
军规 21:使用TRANSACTION保证数据完整性
在操作数据库时,应该使用 TRANSACTION 来保证数据的完整性。例如,在转账操作中需要同时更新两个账户,就需要使用 TRANSACTION:
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
军规 22:避免使用Mysql中的预留字作为列名或表名
在设计表时,应该避免使用 MySQL 中的预留字作为列名或表名,例如:SELECT, FROM, WHERE 等。
军规 23:降低数据库范式
在设计数据库时,应该尽量降低范式,避免查询过程中需要使用多个表进行联合查询。
军规 24:使用HINTS改变查询执行方式
在查询中,可以使用 HINTS 来改变查询的执行方式,提高查询性能。例如:
SELECT /*! STRAIGHT_JOIN */ * FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;
军规 25:避免在SELECT语句中使用子查询
在 SELECT 语句中使用子查询会导致 MySQL 需要进行较多的计算,影响查询性能。应该尝试使用 JOIN 来代替。
军规 26:尽量避免使用FULLTEXT索引
FULLTEXT 索引在处理大量数据时,性能非常低下。应该尽量避免使用。
军规 27:使用UNION ALL替代UNION
在多表联合查询时,应该尽量使用 UNION ALL 来代替 UNION。这会提高查询性能。
军规 28:使用INNER JOIN替代CROSS JOIN
在多表联合查询时,应该使用 INNER JOIN 来代替 CROSS JOIN。这会提高查询性能。
军规 29:避免使用临时表
在查询中,应该尽量避免使用临时表。如果必须使用,可以通过增加内存缓存来提高查询性能。
军规 30:修改系统变量
在 MySQL 中,有很多系统变量可以用来调优性能。可以根据实际情况修改系统变量。例如,可以修改 innodb_buffer_pool_size 变量来调整缓冲池大小。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Mysql 30条军规 - Python技术站