MySQL 创建索引和索引效率验证

本文详细介绍了MySQL中索引的创建方法及验证其对查询效率的显著提升。通过实例演示了如何在数据量庞大的表中创建索引,以及索引如何加速数据查询过程。并对比了有无索引情况下查询同一数据所需时间,直观展示了索引的重要性。

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

MySQL 创建索引和索引效率验证

对于一张存储数据的表来说,通常来说数据量会很大。

项目中总会有一些表数据量非常大,并且在使用过程中,需要频繁地到这些表中查询数据。

数据量大的时候,查询速度会明显变慢,这时候就需要对查询速度进行优化了。

优化的方式很多,一个比较简单且低成本的方式就是创建索引。

一、索引简介

索引的目的是为了提高数据表的查询效率。

索引的作用类似于字典前面的拼音,笔画。拼音的顺序是固定的,在不知道一个字怎么写时,可以快速根据拼音来找到对应的字。看到一个字不知道怎么读时,通过前面的笔画,也可以快速找到对应的字。通过拼音或笔画找到一个字,与在一整本字典中找到一个字,这两种方式的速度差距是非常明显的。

索引可以通过层层的筛选,快速精确地定位到指定的数据,避免了查询数据时的全表扫描。这种定位速度是数量级的速度,数据量越大,效果越明显。

可见,索引的原理就是通过不断地缩小想要获得数据的范围来筛选出最终想要的结果。比如从1000中找到123,没有索引会从1开始逐一查找,直到找到123,有索引了先找到1开头的,再找第二个数是2的,然后找到123。索引的原理就类似这样,比全表扫描高效得多。

二、索引的使用

1. 连接数据库

先连接 mysql 数据库,进入到 MyDB_one 数据库中。

在 MyDB_one 中有一张表 Phone_table 。

2. 查看表中的索引

使用 show index from 表名; 查看表中的索引。

show index from Phone_table;

在上面的这张表中,现在还没有任何数据,所以也没有索引,查询结果为空 Empty 。

3. 批量插入数据

为了演示创建索引的方法和索引的效果,需要先在数据表中添加数据。而且,为了对比有无索引的效率差距,需要插入大量的数据,所以使用代码来批量插入数据到表中。

先使用 desc 表名; 查看表的字段。

desc Phone_table;

接下来使用 Python 的 pymysql 模块在数据库中插入数据。

使用 pymysql 进行数据库编程可以参考: https://blog.csdn.net/weixin_43790276/article/details/90345306

# coding=utf-8
from pymysql import connect


def insert_data():
    """
    在Phone_table中新增100000条数据
    """
    conn = connect(
        host="localhost",
        port=3306,
        user="admin",
        password="Mysql!123",
        database="MyDB_one",
        charset="utf8"
    )
    cursor = conn.cursor()
    for i in range(100000):
        sql = "insert into Phone_table values({id}, 'Phone{i}', 'black');".format(id=i, i=i)
        try:
            cursor.execute(sql)
            conn.commit()
        except Exception as e:
            print(e)
    cursor.close()
    conn.close()


if __name__ == '__main__':
    insert_data()

运行上面的代码,会在数据表 Phone_table 中插入十万条数据,运行需要一些时间,等待一会。

select * from Phone_table;

当数据量达到十万条时,查询所有数据,也花了一些时间。

4. 给数据表创建索引

使用 create index 索引名 on 表名(字段名称(长度)); 来创建索引。

 如果指定的字段类型是字符串,需要指定长度,建议长度与数据表中定义字段时的长度一致。如果字段类型不是字符串,不用写长度。

create index phone_index on Phone_table(pid);

创建索引后,查看索引,可以看到刚创建的索引信息。

5. 删除索引

使用 drop index 索引名 on 表名; 来删除索引。

drop index phone_index on Phone_table;

删除索引后,数据表的索引为空。

三、验证索引的效率

有索引和没有索引的表查询效率差距是非常大的。在同一张表中,保持数据不变,查同一条数据,来对比有无索引的查询时间,就可以对比出效率的差异。

1. 开启 MySQL 运行时间监测
使用 set profiling=1; 开启 MySQL 运行时间检测,通过运行时间来对比有无索引的效率。

开启运行时间检测后,数据库操作的运行时间会保存在 information_schema 数据库的 profiling 表中,如果退出数据库连接,profiling 表中的数据会被自动删除。

set profiling=1;

设置之后,进行数据库操作的运行时间会被记录下来。

2. 没有创建索引时查询

select * from Phone_table where pid=77777;

从查询结果下面的时间可以看出是0.04秒。

3. 创建索引后查询

上面已经将刚才创建的索引删掉了,现在重新创建索引,然后执行相同的查询语句。

从查询结果下面的时间可以看到是0.00秒,所以说这个时间的精度不够,需要使用更精确的监测时间来查看。

4. 查看执行的时间

可以使用 show profiles; 查看运行时间。

也可以到 information_schema 数据库的 profiling 表中去查询,这个时间的精度比查询结果下显示的时间精度高很多,可以方便对比。

show profiles;

通过 show profiles; 查看,创建索引之前的查询时间是 0.03757600 秒,创建索引之后的查询时间是 0.00038250 秒,时间相差了 将近 100 倍,这就是索引带来的效率提升。(运行时间每次不一样,不过数量级一般不会变)

在实际的项目中,数据远比十万条要多,那样索引带来的效率提升效果会更明显。

当然,不是所有的表都需要建立索引。如果表中数据很少,没有必要建立索引。如果一个表中的数据增删很频繁,不适合索引 ,因为只要数据发生增减,索引就要重新建立,建立索引是很耗时的,频繁建立索引反而效率更低了。索引只适合查询操作频繁的表。

 

 

<think>嗯,我现在需要介绍一下MySQL创建索引的语句。首先,我应该回顾一下索引的基本概念,因为索引对于数据库性能优化非常重要。索引可以加快查询速度,但也会增加写入操作的开销,所以需要合理使用。然后,我得想想MySQL中有哪些类型的索引,比如普通索引、唯一索引、主键索引、全文索引、空间索引等。接下来,可能需要分别说明如何创建这些不同类型的索引。 然后,创建索引的语法结构是怎样的呢?记得有CREATE INDEX语句,还有在创建表的时候可以定义索引,或者修改表结构的时候添加索引。比如,使用CREATE INDEX语句的基本格式应该是CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (column1, column2, ...); 这里需要注意索引类型的关键字位置,比如UNIQUE表示唯一索引,FULLTEXT是全文索引,SPATIAL是空间索引,不过空间索引可能只在特定存储引擎如MyISAM中支持。 另外,ALTER TABLE语句也可以用来添加索引,比如ALTER TABLE table_name ADD INDEX index_name (column_list); 同样,添加主键索引的话可能要用ALTER TABLE ... ADD PRIMARY KEY,不过主键通常是在建表的时候定义的。还有,创建表的时候在列定义后面直接指定索引,比如在CREATE TABLE语句中,某个字段后面加INDEX或UNIQUE关键字,或者在语句的最后用INDEX或KEY关键字来定义复合索引。 需要举一些例子,这样更清楚。比如创建普通索引的例子,唯一索引的例子,还有复合索引的例子。同时,可能还要提到删除索引的方法,比如DROP INDEX语句或者ALTER TABLE DROP INDEX,这样回答会比较完整。 另外,注意事项部分也很重要。比如索引不是越多越好,过多的索引会影响插入、更新、删除的速度。还有索引的选择性,高选择性的字段适合建索引,像性别这样的低选择性字段可能不适合。索引的维护也很重要,定期分析表,检查索引使用情况,使用EXPLAIN来查看查询是否用到了索引。 可能还需要提到一些最佳实践,比如避免在长文本字段上建索引,或者使用前缀索引。比如VARCHAR(255)的字段,可以只索引前几个字符。另外,覆盖索引的概念,如果查询的列都包含在索引中,可以避免回表,提高效率。 对了,还要注意不同的存储引擎对索引的支持有所不同,比如InnoDBMyISAM在索引结构上的区别,比如InnoDB使用聚簇索引,而MyISAM是非聚簇的。这可能影响到索引的设计策略。 总结起来,我需要分步骤介绍创建索引的不同方法,包括CREATE INDEX、ALTER TABLE以及建表时定义,然后给出每种情况的示例,再讨论注意事项最佳实践。这样用户就能系统地了解如何创建索引,并且知道在什么情况下使用哪种方法比较合适,以及需要注意的问题。</think>MySQL创建索引是优化查询性能的重要手段。以下是创建索引的详细说明及示例: --- ### 一、索引类型及语法 MySQL支持多种索引类型,语法结构如下: #### 1. **普通索引** ```sql -- 创建索引 CREATE INDEX index_name ON table_name (column1, column2, ...); -- 修改表结构添加索引 ALTER TABLE table_name ADD INDEX index_name (column1, column2, ...); ``` #### 2. **唯一索引** ```sql CREATE UNIQUE INDEX index_name ON table_name (column_name); ALTER TABLE table_name ADD UNIQUE INDEX index_name (column_name); ``` #### 3. **主键索引** ```sql -- 建表时定义 CREATE TABLE table_name ( id INT PRIMARY KEY, ... ); -- 修改表结构添加主键 ALTER TABLE table_name ADD PRIMARY KEY (column_name); ``` #### 4. **全文索引(仅限文本字段)** ```sql CREATE FULLTEXT INDEX index_name ON table_name (text_column); ALTER TABLE table_name ADD FULLTEXT (text_column); ``` #### 5. **组合索引** ```sql CREATE INDEX index_name ON table_name (col1, col2, col3); ``` --- ### 二、创建索引的三种方式 #### 方法1:使用`CREATE INDEX`语句 ```sql -- 示例:为`users`表的`email`字段创建唯一索引 CREATE UNIQUE INDEX idx_email ON users (email); ``` #### 方法2:使用`ALTER TABLE`语句 ```sql -- 示例:为`orders`表的`order_date`字段添加普通索引 ALTER TABLE orders ADD INDEX idx_order_date (order_date); ``` #### 方法3:建表时定义索引 ```sql CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(100), price DECIMAL(10,2), INDEX idx_name (name), -- 普通索引 UNIQUE INDEX idx_price (price) -- 唯一索引 ); ``` --- ### 三、删除索引 ```sql -- 删除普通/唯一索引 DROP INDEX index_name ON table_name; -- 删除主键索引 ALTER TABLE table_name DROP PRIMARY KEY; ``` --- ### 四、注意事项 1. **索引选择原则** - 高频查询条件(如`WHERE`、`JOIN`、`ORDER BY`字段)适合建索引。 - 数据重复率低的字段(高选择性)效果更好,如`用户ID`优于`性别`。 2. **性能权衡** - 索引会占用存储空间,并降低`INSERT`/`UPDATE`/`DELETE`速度。 - 避免过度索引:单表索引数量建议不超过5个。 3. **前缀索引** ```sql -- 对长文本字段的前N个字符建立索引 CREATE INDEX idx_name_prefix ON users (name(10)); ``` 4. **索引失效场景** - 对索引列进行运算(如`WHERE price*2 > 100`)。 - 使用`LIKE '%keyword'`左模糊查询。 --- ### 五、验证索引效果 使用`EXPLAIN`分析查询是否命中索引: ```sql EXPLAIN SELECT * FROM users WHERE email = 'user@example.com'; ``` --- 通过合理使用索引,可显著提升查询性能。建议结合业务场景数据分布,定期优化索引策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌哥ge

非常感谢,祝你一切顺利。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值