博客园

索引原理和慢查询优化

1、什么是索引

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构
优化查询、提升查询速度
ps:创建完索引后会降低增、删、改的效率
读写比列很小 不到10:1

2、如何正确看待索引

开发人员最懂业务,任何一个软件都有吸引用户的亮点
亮点背后对应的是热数据,这一点开发人员最清楚
开发人员最了解热数据对应数据库表字段有哪些,所以
应该在开发软件的过程中就提前为相应的字段加上索引,而不是
等到软件上线后,让DBA发现慢查询sql再做处理,因为
---1、一个软件慢会影响用户体验,但是慢的原因有很多,你不能立即确定是sql的问题所以等到定位到sql的问题可能已经过去好久了,问题已经被拖很久了
---2、因为大多数DBA都是管理型DBA而非开发型,所以即使是DBA也很难从日志上
看到了慢查询sql也会因为不懂业务而很难分析出慢的原因,最后这个锅还得扣在开发
的脑袋上。

3、索引到底是一种什么样的数据结构:B+树

二叉树、平衡二叉树、B树=》B+树
表--》书
记录--》一页内容

索引--》书的目录

B+树的优点
    1、在二叉树、平衡二叉树、B树的基础上做了进一步优化
    只有在叶子节点放真正的数据,这意味着在等量数据的前提下,B+树的高度是最低的
    2、B+的叶子节点都是排好序的,所以在范围查询上、B+比B更快
    快在找到一个树叶节点,就不需要从树根查起了</font>

4、innodb存储引擎索引分类

1、hash索引  k,v 类似字典形式  适合等值查询
2、B+树索引 较常用  适合范围查询
    聚集索引/聚簇索引-》以主键字段的值作为key创建的索引(一张表只有一个)
    辅助索引:针对非主键字段创建的索引(一张表可以有多个)
        叶子节点放的是 k字段 v主键
innodb-》索引组织表

select name,age,gender from user where id =3; 主键
select name,age,gender from user where name = 'liu';
回表查询:通过辅助索引拿到 主键值 再回到聚集索引从根再查一遍
覆盖索引:不需要回表就能拿到你想要的全部数据
select name,id from user where name = 'liu';
5、索引的简单使用

create table t1(
    id int,
    name varchar(10),
);
create index ind_xxx on t1(id);
drop index index_xxx on t1

命中索引也未必能起到很好的提速效果 比如范围查询

select count(*) from s1 where id > 3;
1、对区分度高并且占用空间小的字段建立索引
2、针对范围查询命中了索引,如果范围很大,查询效率依然很低,如何解决
要么把范围缩小
要么就分段取值,一段一段取最终把大范围取完
3、索引下推技术(默认开启)

4、select count(*) from where id*12 =3; 可以换成 select count(*) from where id = 3/12;
    
    不要把查询字段放到函数或者参与运算
5、索引覆盖

6、最左前缀匹配原则    联合索引
    create index idcx_id_name_gender on s1(id,name,gender);
    id
    id name
    id gender
    id name gender
    (必须有id)
posted @ 2021-02-24 20:50  小刘学python  阅读(78)  评论(0编辑  收藏  举报