mysql 索引

本文深入探讨MySQL索引的创建与优化策略,包括不同类型的索引如主键、唯一、普通和全文索引的使用场景,以及它们对查询速度的影响。文章强调了索引在大数据量下的优势,同时指出了其可能带来的插入、更新和删除操作的性能下降。此外,还提供了创建高效索引的建议,如避免在列上进行运算、使用短索引和最佳左前缀特性。

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

mysql索引是mysql一般优化比不可少的话题,但并不是索引越多性能就越好,索引也需要开销。

PRIMARY KEY(主键索引)  ALTER TABLE `table_name` ADD PRIMARY KEY ( `col` ) 

UNIQUE(唯一索引)     ALTER TABLE `table_name` ADD UNIQUE (`col`)

INDEX(普通索引)     ALTER TABLE `table_name` ADD INDEX index_name (`col`)

FULLTEXT(全文索引)      ALTER TABLE `table_name` ADD FULLTEXT ( `col` )
组合索引   ALTER TABLE `table_name` ADD INDEX index_name (`col1`, `col2`, `col3` )

索引的优点:

       可以提高大数据量下查询速度

索引的缺点:

       会影响insert、update、delete等的速度,会占用空间磁盘大小,在mysql安装路径的data、数据库名下,文件后缀是.MYI的文件格式,以表名为文件名的格式,见下图

1.索引要创建在where和join用到的字段上.

2.以下操作符号可以应用索引

:<,<=,=,>,>=,BETWEEN,IN,LIKE不以%_开头

以下需要注意不使用索引

<>, NOT IN, LIKE %_开头

<> 可以用 a>1 or a<3 代替,NOT IN 可以用NOT exists代替

3.在使用max() min()时最好加上索引.

4.单索引要创建在确实需要的地方

5多列索引 有最佳左前缀特性 所以尽量左边的字段是最常用的.

6.索引不会包括有NULL值,就是有NULL,索引就失效

7.使用短索引,一个字段字太多,可以建立部分索引,只取前十个字.节约空间.

8.不要在列上运算.例如:where MD5("password") = "myz"

●索引的创建

主键索引:

创建表时设置某列为主键该列就是主键索引.看下图

表名是salgrade、key_name 指的是索引的名称,即主键(PRIMARY)索引   当然我是在这张表的grade列设置为主键的.index_type是用的索引方法,BTREE指的是二叉树算法,索引底层调用的二叉树算法来进行查询速度的提升,相关算法请自行百度,

二叉树大概原理

  比如11条数据,首先从中间取6,如果是,就取出,不是再分为12345和789 10 11,再从12345取中间就是3  然后分为12 45   然后12中向上取整就是2 剩余1 原理大概就是这样。

普通索引:

一般来说普通索引的创建是先建表,再创建普通索引   create index 索引名 on 表(列名)

    这张表我有5条数据

再次查看索引show index from 表名

创建好了,索引名是aaa、bbb,其他的就不解释了.本地我用400W数据查询的时候用了1秒多,用索引后一秒不到 基本是0.00SEC,有兴趣可以自行测试,测试请用数据量百万级上的,不然不好看出差别

全文索引:

mysql引擎为MyISAM才会生效,innodb不会生效,即使创建了全文索引在innodb下也不会生效,好像也只对英文有效哦,汉字不生效的,用分词处理

例如:我们有一个文章表(article),其中有主键ID(id)、文章标题(title)、文章内容(content)三个字段。现在我们希望能够在title和content两个列上创建全文索引,article表及全文索引的创建SQL语句如下:

CREATE TABLE `article` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `title` varchar(200) DEFAULT NULL,

  `content` text,

  PRIMARY KEY (`id`),

  FULLTEXT KEY `title` (`title`,`content`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

再查看索引

可以看到索引名都是title,但是运用在title和content列上的。

如何使用全文索引?

select * from article WHERE title like 'mysql%';这种不能用到全文索引,错误用法

我们可以验证一下,用 EXPLAIN select * from article WHERE title like 'mysql%'   看结果

没有用到索引。其他的列表示的意思以及EXPLAIN关键字的用法网上很多资料

正确的用法:

select * from articles where match(title,content) against(‘database’);

看看是否用到索引:

用到了索引

 

唯一索引:

当表的某列被指定为unique约束时,这列就是一个唯一索引

create table ddd(id int primary key auto_increment , name varchar(32) unique);

这时, name 列就是一个唯一索引.

unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复.其实主键也是唯一索引,一般主键都是不重复的

语法:create unique index 索引名  on 表名 (列表);

 

查看表的索引

desc 表名 【该方法的缺点是: 不能够显示索引名.】

show index from 表名

show keys from 表名

删除索引

alter table 表名 drop index 索引名;

如果删除主键索引。

alter table 表名 drop primary key

修改索引

先删除,再重新创建

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值