建设网站都要学些什么问题企业年报系统官网
2026/3/23 14:29:43 网站建设 项目流程
建设网站都要学些什么问题,企业年报系统官网,简答网站开发流程,wordpress lamp 建站MySQL索引详解 一、索引是什么#xff1f; 索引是数据库中的一种数据结构#xff0c;类似于书籍的目录#xff0c;它可以帮助数据库快速定位和访问表中的数据#xff0c;而不需要扫描整个表。 二、MySQL索引分类 1. 按数据结构分类 索引类型存储引擎特点适用场景BTree…MySQL索引详解一、索引是什么索引是数据库中的一种数据结构类似于书籍的目录它可以帮助数据库快速定位和访问表中的数据而不需要扫描整个表。二、MySQL索引分类1.按数据结构分类索引类型存储引擎特点适用场景BTree索引InnoDB、MyISAM默认索引平衡树结构范围查询、排序、等值查询Hash索引Memory/Heap哈希表结构O(1)查找等值查询不支持范围查询Full-Text索引InnoDB、MyISAM全文搜索文本字段的模糊搜索R-Tree索引MyISAM空间数据索引GIS地理数据2.按逻辑功能分类主键索引 (Primary Key)CREATETABLEusers(idINTPRIMARYKEY,-- 主键索引nameVARCHAR(50));每张表只能有一个不允许NULL值自动创建聚簇索引InnoDB唯一索引 (Unique Index)CREATEUNIQUEINDEXidx_emailONusers(email);确保列值唯一允许NULL值但只能有一个NULL可以有多个普通索引 (Normal Index)CREATEINDEXidx_nameONusers(name);最基本的索引类型仅用于加速查询全文索引 (Full-Text Index)CREATEFULLTEXTINDEXidx_contentONarticles(content);用于全文搜索支持MATCH AGAINST语法组合索引 (Composite Index)CREATEINDEXidx_name_ageONusers(name,age);多列组合的索引最左前缀原则空间索引 (Spatial Index)CREATESPATIALINDEXidx_locationONplaces(location);用于地理空间数据3.按物理存储分类聚簇索引 (Clustered Index)InnoDB中主键就是聚簇索引数据行和索引存储在一起一个表只有一个非聚簇索引 (Non-Clustered Index)索引和数据分开存储MyISAM默认都是非聚簇索引InnoDB的二级索引三、常用索引类型最常用的索引BTree索引95%以上场景组合索引优化多条件查询唯一索引保证数据唯一性主键索引每张表必须有四、索引生效场景什么时候有效1. 全值匹配-- 索引 idx_name_age(name, age)SELECT*FROMusersWHEREname张三ANDage25;-- ✅ 生效2. 最左前缀匹配-- 索引 idx_name_age_city(name, age, city)SELECT*FROMusersWHEREname张三;-- ✅ 生效SELECT*FROMusersWHEREname张三ANDage25;-- ✅ 生效SELECT*FROMusersWHEREage25;-- ❌ 不生效跳过了name3. 范围查询部分生效-- 索引 idx_name_age(name, age)SELECT*FROMusersWHEREname张三ANDage20;-- ✅ 生效SELECT*FROMusersWHEREname张三;-- ✅ 生效4. 覆盖索引-- 索引 idx_name_age(name, age)SELECTname,ageFROMusersWHEREname张三;-- ✅ 生效不需要回表5. 排序操作-- 索引 idx_name_age(name, age)SELECT*FROMusersORDERBYname,age;-- ✅ 生效SELECT*FROMusersORDERBYnameASC,ageDESC;-- ❌ 不生效混合排序6. 分组操作-- 索引 idx_name_age(name, age)SELECTname,COUNT(*)FROMusersGROUPBYname;-- ✅ 生效五、索引失效场景什么时候无效1. 违反最左前缀原则-- 索引 idx_name_age(name, age)SELECT*FROMusersWHEREage25;-- ❌ 不生效SELECT*FROMusersWHEREage25ANDname张三;-- ✅ 生效优化器会调整顺序2. 在索引列上运算或函数-- 索引 idx_name(name)SELECT*FROMusersWHERELEFT(name,1)张;-- ❌ 不生效SELECT*FROMusersWHEREYEAR(create_time)2024;-- ❌ 不生效3. 使用不等于(!, )SELECT*FROMusersWHEREname!张三;-- ❌ 不生效全表扫描更优4. 使用IS NULL/IS NOT NULL特殊情况SELECT*FROMusersWHEREnameISNULL;-- ✅ 可能生效SELECT*FROMusersWHEREnameISNOTNULL;-- ❌ 通常不生效5. LIKE以通配符开头SELECT*FROMusersWHEREnameLIKE%张三%;-- ❌ 不生效SELECT*FROMusersWHEREnameLIKE张三%;-- ✅ 生效6. 类型转换-- 假设phone是varchar类型索引 idx_phone(phone)SELECT*FROMusersWHEREphone13800138000;-- ❌ 不生效隐式类型转换SELECT*FROMusersWHEREphone13800138000;-- ✅ 生效7. OR条件部分无索引-- name有索引age无索引SELECT*FROMusersWHEREname张三ORage25;-- ❌ 不生效8. 数据量小时-- 表只有100行数据SELECT*FROMsmall_tableWHEREnametest;-- ❌ 可能不生效全表扫描更快9. 统计信息不准确-- 当索引统计信息过时优化器可能选择全表扫描ANALYZETABLEusers;-- 更新统计信息六、索引设计最佳实践创建索引的黄金法则-- 1. 选择性高的列建索引CREATEINDEXidx_emailONusers(email);-- email唯一性高-- 2. 常用查询条件组合建索引CREATEINDEXidx_queryONorders(user_id,status,create_time);-- 3. 覆盖索引设计CREATEINDEXidx_coveringONusers(name,age,email);-- 查询SELECT name, age, email FROM users WHERE name 张三;索引使用建议不要过度索引每个索引都有维护成本更新频繁的列谨慎建索引小表不建议建索引避免冗余索引定期分析索引使用情况-- 查看索引使用情况SHOWINDEXFROMtable_name;-- 查看未使用的索引SELECT*FROMsys.schema_unused_indexes;七、性能诊断工具1. EXPLAIN分析EXPLAINSELECT*FROMusersWHEREname张三;2. 查看索引统计-- 查看索引区分度SELECTINDEX_NAME,CARDINALITY,TABLE_ROWS,ROUND(CARDINALITY/TABLE_ROWS*100,2)asselectivityFROMinformation_schema.STATISTICSWHERETABLE_NAMEusers;3. 慢查询日志-- 开启慢查询SETGLOBALslow_query_logON;SETGLOBALlong_query_time1;八、常见问题排查索引失效排查步骤使用EXPLAIN分析执行计划检查WHERE条件是否符合最左前缀检查是否有类型转换检查是否使用函数或计算检查统计信息是否准确检查数据量是否太小索引优化示例-- 问题查询SELECT*FROMordersWHEREDATE(create_time)2024-01-01-- ❌ 索引失效ANDstatus1;-- 优化后SELECT*FROMordersWHEREcreate_time2024-01-01ANDcreate_time2024-01-02-- ✅ 索引生效ANDstatus1;-- 创建合适索引CREATEINDEXidx_time_statusONorders(create_time,status);记住原则索引不是越多越好合适的索引才是最好的。定期审查和优化索引是DBA的重要工作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询