php图片网站源码,北京感染人数最新消息,百度新网站提交入口,wordpress首页设置成文章还是页面1、索引优化
索引可以显著加速查询操作#xff0c;但过多或不适当的索引也会带来负面影响#xff08;如增加写入开销#xff09;。因此#xff0c;选择合适的索引至关重要。
创建索引#xff1a;
为经常用于WHERE子句、JOIN条件和ORDER BY排序的列创建索引。
CREATE I…1、索引优化
索引可以显著加速查询操作但过多或不适当的索引也会带来负面影响如增加写入开销。因此选择合适的索引至关重要。
创建索引
为经常用于WHERE子句、JOIN条件和ORDER BY排序的列创建索引。
CREATE INDEX idx_last_name ON employees (last_name);复合索引
如果多个列经常一起出现在查询条件中考虑创建复合索引。
first_name, last_name复合索引即使 where first_name 也会走复合索引但是where last_name不行
CREATE INDEX idx_composite ON orders (customer_id, order_date);覆盖索引
确保索引包含所有需要返回的数据列从而避免回表查找。
意思是索引里面是你需要查询的字段比如product_name
CREATE INDEX idx_covering ON products (category_id, price, product_name);索引first_name, last_name即使last_name不是索引第一个但是查询里面有last_name所以走索引
如果查询字段存在索引里面没有的字段不包括主键则不会走索引
SELECT last_name FROM 123.Employees WHERE last_name索引维护
定期分析和优化索引删除不再使用的索引以减少不必要的开销。
2、查询优化
优化SQL查询可以帮助减少执行时间和资源使用。
避免全表扫描
尽量使用索引来限制扫描范围避免对大表进行全表扫描。
EXPLAIN SELECT birth_date,first_name FROM Employees WHERE last_name减少结果集大小
只选择需要的字段而不是使用SELECT *。
优化连接JOIN
确保参与连接的列上有适当的索引并且尽可能缩小连接前的结果集。
SELECT o.order_id, c.customer_name
FROM orders o JOIN customers c ON o.customer_id c.customer_id
WHERE o.status shipped;预过滤在执行连接之前尽可能地减少每个表中的行数。你可以通过添加更严格的WHERE子句条件来实现这一点。比如如果只需要特定日期范围的数据就在连接之前用WHERE子句限定日期范围。
示例
场景描述
在一个电子商务系统中有orders订单表和products商品表。我们想要获取在过去一个月内购买了特定类别商品的所有订单详情。如果不进行预过滤这将涉及到两个大表之间的全表扫描和连接。
SELECTo.order_id,p.product_name,o.order_date
FROMorders oJOIN order_items oi ON o.order_id oi.order_idJOIN products p ON oi.product_id p.product_id
WHEREo.order_date 2024-11-01 AND p.category Electronics;首先对products表按照商品类别进行预过滤然后再执行连接操作。这样可以大大减少需要连接的数据量。
-- 用一个临时表做中间数据
WITH FilteredProducts AS (SELECTproduct_id,product_name FROMproducts WHEREcategory Electronics
)SELECTo.order_id,fp.product_name,o.order_date
FROMorders oJOIN order_items oi ON o.order_id oi.order_idJOIN FilteredProducts fp ON oi.product_id fp.product_id
WHEREo.order_date 2024-11-01;分页对于大型结果集考虑使用分页技术来限制每次查询返回的行数。这对于前端展示大量数据尤其有用。
聚合如果可能的话在连接之前对数据进行聚合。这意味着可以在连接前就计算出统计信息如SUM、COUNT等从而减少连接操作的数据量。
示例
场景描述
假设有一个电子商务平台其中有两个表——orders订单表和order_items订单详情表。orders表存储了每个订单的基本信息而order_items表则记录了每个订单中购买的商品详情以及单价等信息。现在想要获取每个用户的总消费金额。
SELECTo.user_id,SUM( oi.quantity * oi.price ) AS total_spent
FROMorders oJOIN order_items oi ON o.order_id oi.order_id
GROUP BYo.user_id;首先在order_items表上根据order_id聚合出每个订单的总金额然后再与orders表连接并最终按用户ID分组计算总消费额
WITH OrderTotals AS (SELECTorder_id,SUM( quantity * price ) AS order_total FROMorder_items GROUP BYorder_id
)SELECTo.user_id,SUM( ot.order_total ) AS total_spent
FROMorders oJOIN OrderTotals ot ON o.order_id ot.order_id
GROUP BYo.user_id;临时表或CTECommon Table Expressions有时将中间结果存储在临时表或使用公用表表达式CTE可以简化查询逻辑并且允许你更早地应用过滤条件。
使用EXPLAIN分析查询计划
通过EXPLAIN关键字查看MySQL如何执行查询识别潜在问题。
EXPLAIN SELECT * FROM orders WHERE order_date 2024-01-01;3、缓存
大部分没有应用场景命中率不高消耗内存
利用缓存机制可以减少重复查询数据库的次数降低负载。
查询缓存Query Cache
虽然MySQL 8.0版本之后官方已经移除了内置查询缓存功能但在某些场景下仍可以通过第三方工具实现类似效果。
应用级缓存
在应用程序层面使用Redis、Memcached等内存存储来缓存频繁访问的数据。
4、硬件优化
硬件升级可以直接影响数据库性能。
**增加内存**更多的RAM意味着更大的缓冲池InnoDB Buffer Pool从而减少磁盘I/O。
**SSD硬盘**相比于传统HDD固态硬盘SSD提供更快的读写速度尤其适合随机访问模式。
**多核CPU**对于高并发工作负载多核心处理器能够更好地处理并发请求。
5、数据库参数调整
根据具体的使用场景调整MySQL配置参数可以进一步提升性能。
innodb_buffer_pool_size
设置InnoDB存储引擎使用的缓存大小默认值通常是物理内存的70%-80%。
query_cache_size
配置查询缓存Query Cache大小的参数虽然MySQL 8.0后不再支持但对于老版本可以根据实际情况设置查询缓存大小。
max_connections
根据预期的最大并发连接数调整最大连接数限制。
thread_cache_size
设置线程缓存大小以快速响应新连接。