2026/4/7 17:41:33
网站建设
项目流程
长沙建设银行招聘网站,线上推广方法,wordpress 安装 权限设置,网站开发层次文章目录如何定位并解决慢查询#xff1f;1. 开启/检查慢日志2. 分析日志3. 用explain分析执行计划SQL优化#xff1f;一、基础优化1. 避免select *2. 使用合适的where条件3. 合理使用索引4. 避免全表扫描二、JOIN优化#xff08;多表查询#xff09;1. 大表驱动小表2. 确保…文章目录如何定位并解决慢查询1. 开启/检查慢日志2. 分析日志3. 用explain分析执行计划SQL优化一、基础优化1. 避免select *2. 使用合适的where条件3. 合理使用索引4. 避免全表扫描二、JOIN优化多表查询1. 大表驱动小表2. 确保JOIN字段都有索引3. 避免多层嵌套JOIN三、子查询 vsJOIN分页优化如何创建、使用索引索引介绍一、创建索引1. 创建普通索引2. 创建唯一索引3. 创建复合索引4. 在建表时直接定义索引5. 添加主键自动添加聚簇索引如何定位并解决慢查询1. 开启/检查慢日志看一下是否开启慢日志SHOWVARIABLESLIKEslow_query_log;SHOWVARIABLESLIKElong_query_time;SHOWVARIABLESLIKEslow_query_log_file;如果未开启临时开启生产环境建议永久配置SETGLOBALslow_query_logON;SETGLOBALlong_query_time1;2. 分析日志mysqldumpslowMySQL 自带# 按执行次数排序前10条mysqldumpslow -s c -t10/var/log/mysql/slow.log# 按总耗时排序前10条mysqldumpslow -s t -t10/var/log/mysql/slow.log3. 用explain分析执行计划在SQL前面加explainEXPLAINSELECTid,order_noFROMordersWHEREuser_id100ANDcreate_time2024-01-01ORDERBYcreate_timeDESC;重点查看四个字段字段看什么type是否出现 ALL全表扫描rows扫描行数是否过大key是否使用到了正确索引Extra是否出现Using filesort或Using temporarySQL优化一、基础优化1. 避免select *-- ❌ 不推荐SELECT*FROMusers;-- ✅ 推荐SELECTid,name,emailFROMusers;2. 使用合适的where条件尽量在where中使用索引字段避免对字段进行函数操作或类型转换(导致索引失效)-- ❌ 索引失效SELECT*FROMordersWHEREYEAR(create_time)2024;-- ✅ 使用范围查询可走索引SELECT*FROMordersWHEREcreate_time2024-01-01ANDcreate_time2025-01-01;3. 合理使用索引对经常用于where、join、order by、group by的列建立索引比卖你过度索引(影响写入性能)考虑使用复合索引最左前缀原则4. 避免全表扫描通过explain检查是否使用了索引EXPLAINSELECT*FROMproductsWHEREcategory_id10;二、JOIN优化多表查询1. 大表驱动小表在MySQL中通常将小结果姐放在left大表在right2. 确保JOIN字段都有索引两个表关联字段都应该有索引3. 避免多层嵌套JOIN复杂JOIN可拆分为多个简单查询三、子查询 vsJOIN子查询在某些数据库中效率较低可以尝试改成JOIN-- ❌ 子查询可能低效SELECT*FROMusersWHEREidIN(SELECTuser_idFROMordersWHEREamount100);-- ✅ 改写为JOINSELECTDISTINCTu.*FROMusers uJOINorders oONu.ido.user_idWHEREo.amount100;分页优化深分页如LIMIT 100000,20性能查因为要跳过大量的数据优化方案使用游标分页基于上一页最后一条记录的ID或时间SELECT*FROMmessagesWHEREid100000ORDERBYidLIMIT20;如何创建、使用索引索引介绍索引类型说明主键索引聚簇索引数据按主键物理存储每一张表只能一个唯一索引不允许出现重复值普通索引最基本的索引允许重复和null全文索引用于文本搜索前缀索引对字符串类的前N个字段创建索引节省空间覆盖索引非独立类型查询字段全部包含在索引中无需回表一、创建索引1. 创建普通索引-- 方法1CREATE INDEX推荐用于已有表CREATEINDEXindex_nameONtable_name(column_name);-- 示例在 users 表的 email 字段上创建索引CREATEINDEXidx_emailONusers(email);2. 创建唯一索引CREATEUNIQUEINDEXidx_usernameONusers(username);3. 创建复合索引符合索引使用时必须遵循最左前缀原则查询时必须包含最左边的列才能生效-- 按顺序先按 category_id再按 created_at 排序CREATEINDEXidx_category_createdONproducts(category_id,created_at);4. 在建表时直接定义索引CREATETABLEorders(idBIGINTPRIMARYKEYAUTO_INCREMENT,user_idINTNOTNULL,statusVARCHAR(20),created_atDATETIME,-- 主键自动创建聚簇索引InnoDBINDEXidx_user_status(user_id,status),-- 普通复合索引UNIQUEINDEXuk_order_no(order_no)-- 唯一索引);5. 添加主键自动添加聚簇索引ALTERTABLEtable_nameADDPRIMARYKEY(id);