MySQL索引类型与创建详解:从理论到实践

需积分: 0 1 下载量 81 浏览量 更新于2024-06-29 收藏 691KB PDF 举报
本章节深入探讨了MySQL索引的创建与设计原则,由尚硅谷-宋红康(江湖人称:康师傅)讲解。索引是数据库管理系统中的一项关键优化技术,对于提高查询效率至关重要。MySQL支持多种类型的索引,包括: 1. **普通索引**(Non-Unique Index):最基本的索引类型,用于加快数据查找速度,但不保证唯一性。 2. **唯一性索引**(Unique Index):索引列中的值必须唯一,不允许有重复,常用于标识字段。 3. **主键索引**(Primary Key Index):一个表只能有一个主键,它既保证唯一性,又用于建立行的物理顺序。主键通常自动创建索引。 4. **单列索引**(Single Column Index):仅基于一个字段创建的索引。 5. **多列(联合、组合)索引**(Composite Index):涉及两个或更多字段的组合,按特定顺序排列,提高部分范围搜索性能。 6. **全文索引**(Full-Text Index):用于全文本搜索,如InnoDB支持的B-tree索引。 7. **空间索引**:针对地理空间数据的特殊索引,用于高效地处理地理位置相关查询。 在MySQL中创建索引通常在表创建时进行,例如: ```sql CREATE TABLE dept ( dept_id INT PRIMARY KEY AUTO_INCREMENT, dept_name VARCHAR(20) ); CREATE TABLE emp ( emp_id INT PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(20) UNIQUE, dept_id INT, CONSTRAINT emp_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept(dept_id) ); ``` 创建索引的基本语法如下: ```sql CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name ON table_name (col_name [length] ASC|DESC); ``` `UNIQUE`, `FULLTEXT`, 和 `SPATIAL` 是可选参数,分别对应不同类型的索引。`INDEX` 和 `KEY` 是同义词,用于指定索引。索引名(index_name)可选,若未指定,则MySQL会使用列名作为默认索引名。对于字符串类型字段,可以指定索引长度(length),并能选择升序(ASC)或降序(DESC)排序。 理解这些概念对于优化数据库性能、提升查询效率以及合理利用不同存储引擎(如InnoDB、MyISAM、Memory和NDB)的特性至关重要。在实际操作中,需要根据业务需求和数据模式来精心设计索引策略,以达到最佳的查询性能。

优化以下Oracle语句: SELECT SUBSTR(msn.serial_number, 1, 10) genset_sn, msi2.segment1 Genset_BOM_NUM, msi2.inventory_item_id, msi.segment1 key_component, mut1.serial_number component_sn, msi.description component_desc, wdj.date_completed, (SELECT MAX(aps.vendor_name) FROM ap_suppliers aps, bom_resources bor, mtl_unit_transactions mut, po_headers_all poh, po_lines_all pol, wip_osp_resources_val_v wor WHERE aps.vendor_id = poh.vendor_id AND bor.resource_id = wor.resource_id AND poh.po_header_id = pol.po_header_id AND pol.item_id = bor.purchase_item_id AND wor.wip_entity_id = mut.transaction_source_id AND mut.serial_number = mut1.serial_number AND mut.inventory_item_id = mut1.inventory_item_id AND mut.organization_id = mut1.organization_id AND mut.receipt_issue_type = 2 AND mut.transaction_source_type_id = 5 ) supplier FROM mtl_material_transactions mmt1, mtl_material_transactions mmt2, mtl_parameters mpa, mtl_serial_numbers msn, mtl_system_items msi, mtl_system_items msi2, mtl_transaction_types mtt1, mtl_transaction_types mtt2, mtl_unit_transactions mut1, mtl_unit_transactions mut2, wip_discrete_jobs_v wdj WHERE mmt1.inventory_item_id = mut1.inventory_item_id AND mmt1.organization_id = mut1.organization_id AND WDJ.PRIMARY_ITEM_ID = msi2.INVENTORY_ITEM_ID AND mmt1.transaction_id = mut1.transaction_id AND mmt1.transaction_source_id = wdj.wip_entity_id AND mmt1.transaction_type_id = mtt1.transaction_type_id AND mtt1.transaction_type_name = 'WIP Issue' AND NOT EXISTS (SELECT 'WIP Negative Issue or WIP Return' FROM mtl_material_transactions mmt3, mtl_transaction_types mtt3, mtl_unit_transactions mut3 WHERE mmt3.transaction_id = mut3.transaction_id AND mmt3.transaction_type_id = mtt3.transaction_type_id AND mmt3.transaction_date > mmt1.transaction_date AND mtt3.transaction_type_name IN ('WIP Negative Issue', 'WIP Return') AND mut3.serial_number = mut1.serial_number AND mut3.inventory_item_id = mut1.inventory_item_id) AND mmt2.transaction_id = mut2.transaction_id AND mmt2.transaction_source_id = wdj.wip_entity_id AND mmt2.transaction_type_id = mtt2.transaction_type_id AND mtt2.transaction_type_name = 'WIP Completion' AND mpa.organization_code = 'WHP' AND msn.current_organization_id = mpa.organization_id AND LENGTH(msn.serial_number) >= 10 AND msi.inventory_item_id = mmt1.inventory_item_id AND msi.organization_id = mmt1.organization_id AND (msi.planning_make_buy_code = 2 OR msi.segment1 LIKE 'SO%') AND mut2.serial_number = msn.serial_number AND mut2.inventory_item_id = msn.inventory_item_id AND mut2.organization_id = mpa.organization_id AND msi2.ORGANIZATION_ID = '323'

222 浏览量
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部