mysql有几种索引类型?使用索引时都有那些地方要注意?sql优化原则

MySQL索引类型包括:一、普通索引 这是最基本的索引,它没有任何限制。有以下几种创建方式:1.创建索引 代码如下:CREATE INDEX indexName ON mytable(username(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。2.修改表结构 代码如下:ALTER ...
mysql有几种索引类型?使用索引时都有那些地方要注意?sql优化原则
MySQL索引类型包括:
一、普通索引
这是最基本的索引,它没有任何限制。有以下几种创建方式:
1.创建索引
代码如下:

CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

2.修改表结构

代码如下:
ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 创建表的时候直接指定。
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

-- 删除索引的语法:
DROP INDEX [indexName] ON mytable;

二、唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

代码如下:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
-- 修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
-- 创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );

三、主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

代码如下:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );

当然也可以用 ALTER 命令。记住:一个表只能有一个主键。
四、组合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:

代码如下:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );

为了进一步榨取MySQL的效率,就要考虑建立组合索引。
二:使用索引的注意事项
使用索引时,有以下一些技巧和注意事项:
1.索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
2.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算

select * from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:

select * from users where adddate<‘2007-01-01';

6.不使用NOT IN和<>操作。

三:sql优化原则
常见的简化规则如下:
1.不要有超过5个以上的表连接(JOIN)
2.考虑使用临时表或表变量存放中间结果。
3.少用子查询
4.视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
5.连接的表越多,其编译的时间和连接的开销也越大,性能越不好控制。
6.最好是把连接拆开成较小的几个部分逐个顺序执行。
7.优先执行那些能够大量减少结果的连接。
8.拆分的好处不仅仅是减少SQL Server优化的时间,更使得SQL语句能够以你可以预测的方式和顺序执行。

如果一定需要连接很多表才能得到数据,那么很可能意味着设计上的缺陷。2016-06-02
大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的操作会导致很多慢查。举例来说:
select * from tab where a=1 and b=2;

场景 1
符合 a=1的记录数有 10w 条记录 ,b=2 有 1000 条记录。如果只是创建idx_a(a),sql 请求通过索引idx_a访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2的记录。这个动作会导致慢查。如果创建组合索引idx_ab(a,b),sql 请求通过索引idx_ab可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。
场景 2
符合 a=1的有 100 条记录,status=2 有 10 条记录。其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。

Tips:
创建索引的目的是通过索引尽可能找到匹配 where 条件的行,减少不必要的回表,提高查询效率;
需要辩证地看待区分度比较低的字段在组合索引中的作用。在组合索引的情况下,我们不能只是单纯地看字段的区分度,而是要看符合条件的记录数是多少。符合条件的记录越少,性能越好。
2021-03-16
mengvlog 阅读 8 次 更新于 2025-07-21 00:05:03 我来答关注问题0
  • MySQL 的四种常见索引类型为普通索引、唯一索引、主键索引和全文索引,以下为你展开介绍:普通索引:这是最基本的索引类型,没有任何限制,主要用于提升查询速度。在创建表时可以直接声明,也能在已有表上使用 ALTER TABLE 或 CREATE INDEX 语句创建。比如在 book 表的 book_name 字段上建立普通索引,能加...

  • MySQL的索引类型主要有以下几种:一、B树索引 简介:B树索引是MySQL中最常用的索引类型,是一种平衡的多路搜索树。 特点:能够处理大量的数据并保持较高的性能,特别是在大型数据表中,通过索引可以显著提高查询速度。二、哈希索引 简介:哈希索引基于哈希表实现。 特点:提供快速的索引查找速度,主要用于ME...

  •  翡希信息咨询 【Mysql】Mysql中索引类型有哪些

    MySQL中索引的类型主要有以下几种:普通索引:适用于where、order by和group by等查询操作。通过单字段索引加快查询速度。创建和更新索引时会降低表的写入效率。唯一索引:确保字段数据的唯一性。可以有多个null值。创建时需注意查询顺序对效率的影响。主键索引:特殊类型的唯一索引。一个表仅能有一个主键索...

  •  翡希信息咨询 MySQL 常见索引类型介绍

    MySQL 常见索引类型主要包括以下几种:聚簇索引:特点:索引与数据存放在一起,找到索引的同时也找到了数据。唯一性:具有唯一性,一张表只有一个聚簇索引。默认情况:默认情况下,聚簇索引是主键;若表未定义主键,InnoDB 会选择一个非空唯一索引代替;否则会定义一个隐藏的_rowid 列作为聚簇索引。非...

  •  文暄生活科普 MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

    在MySQL数据库中,索引的类型主要有四种:PRIMARY、INDEX、UNIQUE和FULLTEXT。它们各自具有不同的特性与应用场景。PRIMARY索引主要用于唯一标识记录。它要求字段值必须唯一且不能为空,通常用于主键。比如,在会员卡系统中,会员编号是一个很好的PRIMARY索引选择。INDEX索引则是普通的索引类型,用于提高查询效率...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部