MySQL操作如何用到索引之原理分析

1.索引类型

1.1 主键索引

建立主键索引有两种方法,第一种,可以在创建表的时候建立,例如:
create table test(id not null primary key);
第二种
ALTER TABLE table_name ADD PRIMARY KEY ( column ) ;

1.2.唯一索引

唯一索引是这一列的数据不能重复
ALTER TABLE table_name ADD UNIQUE ( column ) ;
唯一索引和主键索引最大的区别是 唯一索引可以允许有一个列为null;

1.3 文本索引

ALTER TABLE table_name ADD FULLTEXT ( column) ;

1.4 普通索引

ALTER TABLE table_name ADD INDEX index_name ( column );

1.5 联合索引

ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 );
最左匹配原则;

1.6 聚集索引

聚集索引:在innodb 种的idb文件上存储了索引和数据都存储在这里,叶子节点存储了完整的记录行;通俗的讲就是索引键值顺序,数据行的物理存储顺序一致;除了聚集索引外的其他索引称为2及索引;

2.MSQL中问题总节

2.1 如果没有索引怎么办?

如果没有主键索引,则会找一个唯一的索引且不为空来作为聚集索引;

2.2 如果没有唯一索引,怎么办?

则会默认生成一个隐藏的rowId,来当作聚集索引。rowID相当于别名

2.3 覆盖索引

如果select 中的所有列已经包含在所用到的索引中,则会使用辅助索引,不需要再进行会表来查询;

2.4 如何建立索引

有一个离散公式来计算,用count(distinct(列明))/count(*),来作为判断依据,如果离散程度越高,则建立索引后,效果显著,如果说离散程度越低,则建立索引的效果几乎没有;

2.5 创建索引

1.再where 判断,order排序,join的on上面,group by 字段上面来创建索引;
2.索引的个数不要过多;
3.区分度低的字段不建议建立索引
4.频繁的更新值,不要作为主键或者索引;
5.不建议使用无序的值(身份证,UUID) 作为索引
6.复合索引把散列度高的字段放在前面;
7.创建复合索引,而不是修改单列索引
8.过长的字段,建立前缀索引

2.6 为什么不建议使用频繁更新的值建立索引?

因为再B+数据,频繁的建立索引,容易导致页的分裂,以及合并,这样会带来更多的性能负载;

2.7 明明建立索引,却不起作用?

1.索引列上使用函数,表达式;(replace,substr,concat,sum,count,avg);
2.字符串不加引号,出现隐式转换;
3.like中前面带有%;
4.负向查询

2.8 索引条件下推(Index Condition Pushdown (ICP) )

select *from student where last_name=‘wang’ and first_name like ‘%zi’;
首先介绍last_name,first_name 上面建立的是联合索引。
假如这条sql在last——name第一个的条件下查询3条数据出来,显然第二个索引是用不到索引的;
1.根据联合索引查出来姓‘wang’的二级索引为3条数据;
2.回表,到主索引上查询全部符合条件的数据;
3.把这3条数据交给server服务层,在服务层上过滤除名字以%zi结尾的员工;
索引条件下推的原理是:这3条数据不会再server端在此进行处理,而是再innodb引擎层,接着这个条件向下查询,查出了所有条件的数据后,返回一条sql给到server;

2.9 在什么条件下能使用索引条件下推呢

规定了什么情况可以使用ICP,什么不可以使用ICP。

可以使用ICP的情况如下:

1 表带有WHERE子句,且

2 存储引擎支持ICP,且

3 系统参数
index_condition_pushdown
被打开,且

4 查询不是针对多表的update或delete操作,且

5 查询也不是子查询,且

6 查询的表不是常量表(如果是常量表因记录数最多为1则没有必要使用ICP),且

7 索引不是聚集索引(如果是InnoDB的主键索引,则是聚集索引,此类索引的查询速度快,也不需要执行ICP以获取ICP能带来的好处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值