详解Mysql 30条军规

详解 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技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Flutter中http请求抓包的完美解决方案

    下面我来为您详细讲解”Flutter中http请求抓包的完美解决方案”。 背景 在开发Flutter应用时,我们经常需要进行网络请求。然而在调试过程中,有时候我们需要通过抓包来检查请求的数据是否准确。而Flutter并没有提供类似于Charles、Fiddler等工具,用来进行网络抓包。因此为了解决这个问题,我们需要寻找一种解决方案。 解决方案 Flutte…

    other 2023年6月26日
    00
  • 怎么安装nslookup

    怎么安装nslookup 在计算机网络中,nslookup 是一个常用的网络工具,主要用于查询域名的 DNS 解析信息。由于它的实用性和方便性,因此在很多情况下,网络管理员或者开发人员需要安装这个工具。本文将介绍如何安装 nslookup 工具。 Windows 系统 nslookup 是 Windows 操作系统的自带工具,因此无需安装。 可以通过以下步骤…

    其他 2023年3月29日
    00
  • mac触控增强神器:bettertouchtool使用详解

    下面是关于“mac触控增强神器:bettertouchtool使用详解”的完整攻略: 1. BetterTouchTool 简介 BetterTool 是一款 Mac 上的控增强神器,它可以帮助用户自定义触控手势、键盘快捷键、鼠标手势等,提高 Mac 的使用效率。下面是 BetterTouchTool 的基本介绍: 支持多种手势:BetterTouchToo…

    other 2023年5月7日
    00
  • Android mvvm之LiveData原理案例详解

    Android MVVM之LiveData原理案例详解 什么是LiveData 在 Android 架构组件中,LiveData 是一个可观察的数据持有者,它可以感知 Activity、Fragment 等生命周期的变化,并在数据发生变化时派发出新的值。 LiveData 原理 在数据更新时,LiveData 会通知观察它的观察者,这种通知是安全的,即无论观…

    other 2023年6月27日
    00
  • 64位 win7 旗舰版安装MSCOMM32.OCX的方法

    安装MSCOMM32.OCX是为了在64位的Windows 7旗舰版上使用串口通信功能。下面是安装MSCOMM32.OCX的详细攻略: 下载MSCOMM32.OCX文件: 首先,打开浏览器并访问可信赖的软件下载网站,如www.ocxdump.com。 在网站的搜索栏中输入\”MSCOMM32.OCX\”并点击搜索按钮。 在搜索结果中找到适用于64位Windo…

    other 2023年7月28日
    00
  • 值得升级吗?苹果iOS10开发者预览版Beta1上手使用体验(图集)

    值得升级吗?苹果iOS10开发者预览版Beta1上手使用体验(图集) 介绍 苹果公司发布iOS 10开发者预览版Beta1已经有一段时间了,现在我们来看一下这个版本是否值得升级,以及它新加入的功能和改进。 步骤 步骤一:备份设备 在进行iOS升级之前,无论是正式版还是预览版,都要先进行设备备份,以防升级过程中数据丢失。 步骤二:下载iOS 10开发者预览版B…

    other 2023年6月26日
    00
  • SQL Serever学习15——进阶

    SQL Server是一款功能强大的关系型数据库管理系统,具有广泛的应用场景。本文将介绍SQL Server的进阶学习内容,包括索引、事务、视图、存储过程等,同时提供两个示例说明。 索引 索引是一种数据结构,用于加速数据库的查询操作。SQL Server支持多种类型的索引,包括聚集索引、非聚集索引、全文索引等。在创建索引时,需要考虑索引的类型、列、排序方式等…

    other 2023年5月5日
    00
  • 教你如何用cmd快速登录服务器

    使用CMD快速连接服务器的步骤如下: 1. 打开CMD窗口 在Windows系统中,打开“开始菜单”,在搜索框中输入“cmd”,然后点击打开“命令提示符”窗口。 2. 连接目标服务器 在CMD窗口中输入如下命令: ssh [username]@[server_address] 其中,[username]是你要登录到服务器的用户名,[server_addres…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部