mysql索引优化

索引在数据库中类似图书馆的目录,合理使用能加快数据库的查询速度。索引在一般使用中,分为单列索引,联合索引(复合索引)

单列索引

例如,目前存在一张表,结构如下:

CREATE TABLE `my_audience_push_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `main_audience_id` varchar(100) NOT NULL COMMENT '主包ID',
  `main_account_id` varchar(50) NOT NULL,
  `account_id` bigint(20) NOT NULL COMMENT '推送账号',
  `audience_id` bigint(20) NOT NULL COMMENT '复制关系的子人群包id',
  `media_type` tinyint(4) NOT NULL DEFAULT '1',
  `type` tinyint(4) NOT NULL COMMENT '0.推送关系  1.复制关系',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=37512 DEFAULT CHARSET=utf8 COMMENT='人群包推送投放记录'

查看|删除索引:

SHOW INDEX FROM `my_audience_push_test`
DROP INDEX U_INDEX ON `my_audience_push_test`

1.PRIMARY : 主键索引,唯一且不能为空,一张表中只能有一个主键索引(通常在建表的时候就指定);
2.NORMAL(Non-Unique)普通索引,索引列没有任何限制:

CREATE INDEX `idx_main_audience_id`  ON `db_my`.`my_audience_push_test` (main_audience_id) COMMENT '普通索引' ALGORITHM DEFAULT LOCK DEFAULT

ALTER TABLE `my_audience_push_test` ADD INDEX `idx_main_audience_id`(main_audience_id)

3.UNIQUE:唯一索引,索引列的值必须是唯一的,但允许有空。

ALTER TABLE `my_audience_push_test` ADD UNIQUE `idx_audience_id`(audience_id)

4.FULLTEXT:全文搜索的索引,字段类型为文本类型。用于搜索很长一篇文章的时候,效果最好。如果文本内容较短,用普通的INDEX也可以。

复合索引

1.复合索引同样具备NORMAL、UNIQUE、FULLTEXT等类型

ALTER TABLE `my_audience_push_test2` ADD INDEX `main_audience_id_account_id`(main_audience_id,main_account_id) COMMENT '复合索引'

2.复合索引的最左原则,当创建一个复合索引a,b,c时,基于以下where条件:

select * from table where a=x and b=y and c=z
select * from table where a=x and b=y 
select * from table where b=y and a=x
select * from table where a=x and c=z
select * from table where c=z and a=x

才起到索引优化查询的作用,原因复合索引在存储结构上,是先存储a再存储b,c的索引,反之以下语句是不起作用的:

select * from table where b=y
select * from table where c=z
select * from table where b=y and c=z

如果希望条件c=z 或者 b=y起作用,就必须指定a的值才行。

索引的不足

1.索引虽然提高了查询速度,但是降低了insert、update、delete的速度,因为这些操作都伴随着对引用的增删改操作;
2.建立索引时会占用一定的硬盘空间;

索引使用注意事项

1.对于单索引的字段,NULL值将不会被包含在索引中;组合索引只有有一列含有NULL值,那么这一列对于组合索引就是无效的,所以在设计数据库的时候尽量避免字段默认值为NULL;
2.尽量使用短索引(索引一般最大长度不能超过1000字节):
一般创建索引时,可以指定索引长度,例如某字段为VARCHAR(100)的列,但真实储存的数据只有20位的话,在创建索引时应指定索引的长度为20,如下:

ALTER TABLE `my_audience_push_test` add INDEX U_INDEX(main_audience_id(20))

3.索引排序:
Mysql在查询的时候只会使用一个索引,因此如果where子句已经使用了索引的话,那么order by中的列是不会使用索引的,所以order by尽量不要包含多个列的排序,如果非要多列排序,最好使用组合索引。
4.like语句使用:
一般不建议使用like语句,如果一定要使用,注意采用like 'aaa%' 而不是 like '%aaa%' ,后者是不会使用到索引的。
5.不要使用not in 和 <> 操作

索引方式HASH和BTREE比较

1.HASH,用于对等比较,如“=”和“<=>”;
2.BTREE,采用树结构存储索引,通常在类似“ = ,> , < , >= , <= , BETWEEN,like ”等操作查询效率较高,也是MySQL默认的存储结构方法;

原文地址:https://www.cnblogs.com/chq3272991/p/10275616.html