mysql索引优化
Posted 集君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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默认的存储结构方法;
以上是关于mysql索引优化的主要内容,如果未能解决你的问题,请参考以下文章