mysql 如何创建索引呢,这个其实很简单

本文深入探讨了MySQL中索引的创建规则、作用、类型和删除方法,并提供了索引创建的实用技巧和注意事项,帮助开发者提高数据库查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql 如何创建索引?

mysql 如何创建索引呢,这个其实很简单 create index或者为己有字段增加索引 ALTER TABLE `table_name` ADD UNIQUE (`column`)

mysql索引作用

在索引列上,除了有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。

mysql索引创建规则:

1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,
则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响; 以上是一些普遍的建立索引时的判断依据。
一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。
因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,
索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,
一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。


2.  创建索引

在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
1.ALTER TABLE

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

 

 代码如下复制代码

ALTER TABLE table_name ADD INDEX index_name (column_list)

ALTER TABLE table_name ADD UNIQUE (column_list)

ALTER TABLE table_name ADD PRIMARY KEY (column_list)

 


其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名 index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
2.CREATE INDEX

CREATE INDEX可对表增加普通索引或UNIQUE索引。//unique只是在index前面加上unique就行了

 

 代码如下复制代码

CREATE INDEX index_name ON table_name (column_list)

CREATE UNIQUE INDEX index_name ON table_name (column_list)


 

table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
3.索引类型

在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。

PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。

下面的SQL语句对students表在sid上添加PRIMARY KEY索引。

 代码如下复制代码

 

ALTER TABLE students ADD PRIMARY KEY (sid)


4.  删除索引

可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。

 

 代码如下复制代码

DROP INDEX index_name ON talbe_name

ALTER TABLE table_name DROP INDEX index_name

ALTER TABLE table_name DROP PRIMARY KEY

 


其中,前两条语句是等价的,删除掉table_name中的索引index_name。

第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

 

5.查看索引

 代码如下复制代码

mysql> show index from tblname;

mysql> show keys from tblname;


· Table

表的名称。

· Non_unique

如果索引不能包括重复词,则为0。如果可以,则为1。

· Key_name

索引的名称。

· Seq_in_index

索引中的列序列号,从1开始。

· Column_name

列名称。

· Collation

列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。

· Cardinality

索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。

· Sub_part

如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

· Packed

指示关键字如何被压缩。如果没有被压缩,则为NULL。

· Null

如果列含有NULL,则含有YES。如果没有,则该列含有NO。

· Index_type

用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

· Comment

一些关于过引的常用语句

 代码如下复制代码

1.添加PRIMARY KEY(主键索引)

mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

2.添加UNIQUE(唯一索引)

mysql>ALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)

mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

4.添加FULLTEXT(全文索引)

mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)

5.添加多列索引

mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )




























mysql中UNIQUE KEY和PRIMARY KEY有什么区别
1,Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求

2,一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY

3,主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。
alter table t add constraint uk_t_1 unique (a,b);
insert into t (a ,b ) values (null,1);    # 不能重复
insert into t (a ,b ) values (null,null);#可以重复

转载于:https://my.oschina.net/loveleaf/blog/482772

<think>嗯,用户现在想了解Oracle和MySQL默认索引的区别。之前他们问过B-树,现在可能是在实际应用中遇到了数据库选择或者优化的问题。首先,我需要确认这两个数据库的默认索引类型,以及它们的具体实现差异。 记得之前回答过B-树和B+树的区别,用户可能已经知道B+树的特点,所以这里需要更深入。Oracle的默认索引是B-tree,但其实是B+树的变种,而MySQL的InnoDB默认也是B+树。不过可能具体的实现细节不同,比如存储方式、叶子节点的结构等。 用户可能想知道为什么不同数据库选择不同的结构,以及这些差异对性能的影响。比如范围查询、数据存储位置、锁机制等。此外,还要考虑聚簇索引和非聚簇索引的区别,因为MySQL的InnoDB使用聚簇索引,而Oracle使用的是堆表还是索引组织表? 需要查阅资料确认Oracle的默认索引是否真的是B+树,或者是否有其他优化。例如,Oracle的索引是否存储数据,还是仅存储指针。而MySQL的InnoDB中主键索引是聚簇的,数据存放在叶子节点,二级索引则存储主键值。 还有事务支持方面,比如MySQL的InnoDB支持行级锁,而Oracle也有自己的锁机制,这可能影响索引的并发性能。另外,索引维护操作,如在线创建索引的能力,两者是否有差异? 还需要考虑使用场景,比如高并发读写、范围查询的效率、全表扫描的优化等。用户可能在实际应用中遇到性能问题,想通过了解索引差异来优化数据库设计。 最后,总结时要指出两者的主要区别,包括结构、存储方式、锁机制、适用场景等,帮助用户做出合理的选择或优化策略。</think>以下是关于**Oracle默认索引**与**MySQL默认索引**核心区别的详细对比,从数据结构到应用场景逐步解析: --- ### 一、默认索引类型与底层结构 | **数据库** | **默认索引类型** | **底层数据结构** | **核心特性** | |------------|--------------------------|------------------------|-----------------------------------------------------------------------------| | **Oracle** | **B-tree索引** | B+树变种 | - 叶子节点存储**行物理地址(ROWID)**,通过ROWID回表查询数据。<br>- 支持**反向键索引**(Reverse Key)优化高并发插入。 | | **MySQL** | **InnoDB的聚簇索引** | B+树 | - 主键索引叶子节点直接存储**完整行数据**(聚簇索引)。<br>- 二级索引叶子节点存储**主键值**而非物理地址。 | **关键区别示意图**: ```plaintext # Oracle B-tree索引结构 索引叶子节点 → [键值1, ROWID1] [键值2, ROWID2] → 数据块通过ROWID定位 # MySQL InnoDB聚簇索引结构 主键索引叶子节点 → [主键1, 行数据1] [主键2, 行数据2] 二级索引叶子节点 → [索引键值, 主键值] → 需回表查询主键索引 ``` --- ### 二、数据存储方式对比 | **特性** | **Oracle** | **MySQL(InnoDB)** | |------------------|-------------------------------------|-------------------------------------| | **数据物理存储** | 堆表(Heap Table)为主 | 聚簇索引组织表(数据按主键顺序存储) | | **行定位方式** | 通过ROWID(文件号+块号+行号)定位 | 直接通过主键索引叶子节点访问数据 | | **二级索引查询** | 需两次I/O(索引→ROWID→数据块) | 需两次I/O(二级索引→主键索引→数据) | **示例场景**: ```sql -- Oracle中通过ROWID快速访问(仅演示逻辑,实际ROWID不暴露) SELECT * FROM employees WHERE ROWID = 'AAAAB0AABAAAAQvAAA'; -- MySQL中通过主键直接获取数据 SELECT * FROM employees WHERE id = 100; ``` --- ### 三、索引特性与优化差异 1. **范围查询效率** - **Oracle**:B-tree索引天然支持范围扫描,但需多次ROWID回表。 - **MySQL**:聚簇索引的连续主键存储使范围扫描更快(减少随机I/O)。 2. **并发写入优化** - **Oracle**:支持反向键索引(Reverse Key Index),将高并发插入的键值反转,分散热点块竞争。 ```sql CREATE INDEX idx_emp_id_reverse ON employees(emp_id) REVERSE; ``` - **MySQL**:通过**自增主键**保证顺序插入,减少页分裂。 3. **索引维护** - **Oracle**:支持在线重建索引(`ALTER INDEX ... REBUILD ONLINE`),减少锁冲突。 - **MySQL**:早期版本重建索引会锁表,8.0+支持在线DDL但仍有部分限制。 --- ### 四、锁机制与事务影响 | **数据库** | **索引锁粒度** | **对事务的影响** | |------------|-----------------------|-------------------------------------------------| | **Oracle** | 行级锁 + 多版本并发控制(MVCC) | 写操作仅锁定特定行,其他事务可读旧版本数据。 | | **MySQL** | 行级锁(InnoDB) + MVCC | 二级索引查询可能锁住主键,死锁概率高于Oracle。 | **示例问题**: 在MySQL中,若事务A更新某行的二级索引字段,事务B并发查询同一主键的其他字段,可能因锁竞争阻塞。 --- ### 五、适用场景对比 | **场景** | **Oracle索引优势** | **MySQL索引优势** | |------------------------|---------------------------------------|---------------------------------------| | **高并发OLTP** | 反向键索引减少热点块争用 | 自增主键优化顺序写入 | | **复杂分析查询** | 位图索引(Bitmap Index)优化低基数字段 | 覆盖索引(Covering Index)减少回表 | | **数据仓库** | 全局索引与分区表结合高效查询 | 全文索引(FULLTEXT)支持文本搜索 | --- ### 六、总结:核心区别与选择建议 | **对比维度** | **Oracle默认索引** | **MySQL默认索引** | |--------------------|------------------------------------------------|--------------------------------------------| | **设计目标** | 适应高并发OLTP与复杂企业级查询 | 侧重Web应用快速读写与简单查询 | | **优化侧重点** | 减少物理I/O + 行级锁竞争 | 减少逻辑查询链路 + 减少页分裂 | | **推荐使用场景** | 金融、ERP等高频写入+混合负载 | 互联网应用、读写分离架构 | **选择建议**: - 需要极致写入并发 → Oracle反向键索引 + 分区表 - 简单查询为主且预算有限 → MySQL覆盖索引 + 自增主键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值