[mysql 2019-07-29] mysql索引及优化

一.索引的简介

1.索引的概念

数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录

2.索引的作用

  • 大大加快数据的查询速度(创建索引的主要原因)
  • 降低数据库的io成本和排序成本
  • 对数据库的数据进行约束(唯一索引保证数据的唯一性)
  • 加快表与表之间的连接

3.建立索引付出的代价

  • 增加数据库的存储空间
  • 插入和修改时耗时更长

4.索引的分类

  • 普通索引
  • 唯一索引:该字段值必须唯一
  • 主键索引:特殊的唯一索引,创建主键时自动创建
  • 全文索引:类型为FULLTEXT,只在char、varchar、text等系列的类型上创建

5.创建索引的原则

  • 主、外键必须建立索引
  • 记录超过300条的数据表应建立索引
  • 经常出现在where子句的字段应建立索引
  • 尽量在小字段上建立索引,尽量避免在超长字段、文本字段建立索引
  • 不在唯一性差的字段上建立索引(如性别、年龄等)
  • 不在更新频繁的字段上建立索引

二、索引的增删改查

1.创建索引

  创建普通(唯一、全文)索引:create [unique | fulltext] index `indexname` on `tablename`(`columnname`);

       创建主键索引:alter table `tablename` add primary key(`columnname`);

2.删除索引

  删除普通(唯一)索引:  

  ALTER TABLE `table_name` DROP INDEX index_name;

  DROP INDEX index_name ON `talbe_name`;

  删除主键索引:

  ALTER TABLE `table_name` DROP PRIMARY KEY;

3.修改索引

  我没有用过具体语句,一般先删除,再添加。

4.查看索引

  show index from `tablename`;

  show keys from `tablename`G   #加G可以竖向显示索引信息,用于命令行

三、索引的优化

1.索引字段不要使用函数或参与运算

select * from tb1 where reverse(name) = 'zhangsan';

select * from tb1 where name=reverse(‘zhangsan’);

select * from tb1 where num+3>100;

select * from tb1 where num >100 -3;   #例子不是很恰当

2.索引字段不要使用 like,尤其是 like ‘%index’

select * from tb1 where name like '%白';

select * from tb1 where name like '李%';

3.索引字段类型要与传入字段一致

select * from tb1 where name= 123;

select * from tb1 where name='123'; #name类型为varchar,传入值要加引号

4.联合索引遵循最左匹配原则

create index ix_name_email on s1(name,email)
----最左前缀匹配:必须按照从左到右的顺序匹配

select * from s1 where email='asdf'; #不可以
select * from s1 where name='zhangsan'; #可以
select * from s1 where name='zhangsan' and email='asdf'; #可以

原文地址:https://www.cnblogs.com/shijt/p/11267451.html