代码编织梦想

索引(index)

     1、什么是索引:

        索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引,当然多个字段联合起来也可以添加索引,索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。

         在查询方面有两种方式:

                  第一种:全表扫描

                  第二种:根据索引检索。

     提醒1:在数据库表中的主、外键上都会自动添加索引对象;当字段上有unique约束,也会自动创建索引对象。  

     提醒2:在数据库中任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。

     提醒3:在MySQL中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,不论索引存储在哪里,索引在mysql当中都是以一个树的形式存在(B Tree)

     2、在什么条件下我们会考虑给字段添加索引:

          条件1:数据量庞大

          条件2:该字段经常出现在where后面,以条件的形式出现,也就是说这个字段经常被扫描。

          条件3:该字段很少进行DML语句操作(insert、delete、update)

        建议不要随便添加索引,因为索引也是需要维护的,如果太多反而会降低系统性能,建议通过主键查询,或通过unique约束的字段查询这样效率是比较高的。

     3、索引的创建和删除:

        创建索引

        给emp表的ename字段添加索引  并起名:emp_ename_index

        create index emp_ename_index on emp(ename);

        删除索引:    

   删除emp表上的emp_ename_index索引对象。

        drop index emp_ename_index on emp;       

        查询表文件关联的索引:

        show index from emp;

     4、执行计划(explain)

        命令格式: explain + 查询语句

        命令作用: 展示当前查询语句是否通过索引来进行定位执行计划可以对查询语句的执行效率进行判断

        * 通过type属性展示查询语句执行效率

    * 执行效率分类:由慢到快

          - all 表示where对全表进行遍历得到的结果(最慢)(需要极力避免的查询方式)

          - type 表示where对全表进行遍历,只不过在select抓取字段内容时,从索引中抓取。

       虽然抓取速度有所提升,但是随着数据行的不断增加,检索效率会大幅度降低

      (也是需要极力避免的查询方式)

         - range 表示where不会对全表文件数据行进行遍历,而是直接从索引得到定位的数据行,将

        大幅度提升查询效率。这是进行sql优化时要保证的最低级别。但是这种级别存在

       【不稳定性】,当字段内容发生变化时,导致索引失效。

            create index sal_index on emp(sal);           #对emp表sal字段创建索引

            查询工资低于1000的职工信息语句的执行效率

            explain select * from emp where sal < 1000;       #range级别.没有创建索引是all级别

          注意:当数据库发现从索引得到的数据行行数达到了表文件总行数的1/3时,此时考虑运行成本问题会放弃使用索引

           - ref 表示where不会对全表数据行进行遍历,而是直接从索引得到定位的数据行,这种情况

                 根据定位条件一次只能得到一个数据行,属于比较稳定的执行效率,sql优化需要努力

                 达到的级别

                 create index ename_index on emp(ename);

                 explain select * from emp where ename = 'SMITH';      #ref级别

            - const 根据主键字段上索引进行定位,是执行效率最快的,但是在实际使用过程中几乎不会被用到,很难达到。

              explain select * from emp where empno = '7369';       #const级别

           5、索引也会失效:

        - 在进行模糊查询的时候以%开始索引会失效:select * from emp where ename like '%T';

        - 使用or的时候,如果其中一边字段没有索引,那么另一边的字段即使有索引也会失效,这就是为什么不建议使用or的原因。建议使用union。

        - 使用复合索引的时候,没有使用左侧的字段查找,索引失效。

          举例:

          create index emp_job_sal_index on emp(job,sal);//创建复合索引(job,sal)

          如果使用job字段检索,索引不会失效,如果使用sal字段检索,索引就会失效!

        - 在where当中索引字段参加了运算,索引失效

        - 在where当中索引字段使用了函数,索引会失效

     6、索引是各种数据库进行优化的重要手段,优化的时候优先考虑的因素就是索引。越是唯一效率越高。

     7、索引的分类:

              单一索引:一个字段上添加的索引

              复合索引:多个字段上添加的索引

              主键索引:主键上添加的索引        (主键上会自动条件索引)

              唯一性索引:具有unique约束的字段上添加的索引        (有unique约束的字段会字段添加索引)

    8、索引的实现原理:

通过B Tree缩小扫描范围,底层索引进行了排序和分区,索引会携带数据在表中的“物理地址”,

最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率

是最高的。

select ename from emp where ename = 'SMITH';

通过索引转换为:

select ename from emp where 物理地址 = 0x3; #0x3是'SMITH'这行数据在硬盘上存储的'物理地址'。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/heliuerya/article/details/128711372

mysql索引index相关命令_fishbear_move_on的博客-爱代码爱编程

本文主要内容: 显示表中多有的索引show all index添加索引ADD INDEX, 添加唯一索引add unique index多列联合添加索引,primary key关键词index vs key sho

数据库中的索引index对象_叶清逸的博客-爱代码爱编程_索引是数据库内部使用的对象

这篇文章讲述的是数据库中的索引index对象,如有不当或者错误之处还望各位大神批评指教。 什么是索引? 索引也是数据库中的一个对象,它独立于表结构,主要作用是用来提高查找的速度。 索引适用范围 适用索引的情况 列中

mysql的索引(index)详解_leboop-l的博客-爱代码爱编程_mysql index

索引分类 (1)普通索引(Key Indexes) (2)唯一索引(Unique Indexes) (3)主键索引(Primary Key Indexes) (4)组合索引(Composite Index) (5)前缀索引( Prefix Indexes) (6)全文索引(Full-Text Indexes) (7)哈希索引(Hash Ind

21_Pandas.DataFrame,重置Series的索引index(reset_index)-爱代码爱编程

21_Pandas.DataFrame,重置Series的索引index(reset_index) 如果使用reset_index()方法,则可以将pandas.DataFrame,pandas.Series的索引索引(行名称,行标签)重新分配为从0开始的序列号(行号)。 如果将行号用作索引,则通过排序更改行的顺序或删除行并得到缺少的号码时,重新索引会

flutter - 数组索引Index问题-爱代码爱编程

问题 在Dart中,对于数组的操作,比如List.map不能很方便地访问列表的索引 Index。 比如,对于一个List,要获取它的的index索引,很难做到。 List myList = ['a', 'b', 'c']; myList.map( (val, index) { // 错误,map方法没有index参数! // 如何获

Elasticsearch7.x索引index的备份和恢复,index索引误删恢复-爱代码爱编程

Elasticsearch不仅提供了索引副本分片功能,还支持索引备份,尤其适合index索引误删或者数据丢失情况的恢复。 具体实现方式是,创建索引备份仓库→备份索引快照到仓库→查询索引备份仓库中快照列表→从备份快照中恢复索引。 三个概念:仓库(repository)、快照(snapshot)、索引(index) 为了方便理解,仓库可以理解为数据库实例

idea一直更新索引index-爱代码爱编程

idea一直更新索引index 第一种第二种 第一种 网上的 https://blog.csdn.net/libusi001/article/details/102800605 第二种 在提交svn是为了方便忽略xml,iml,在setting–>filetype 中加入了忽略。 导致一直扫描。 解决:把 *.iml; 删掉 把 *

R语言 改变重置dataframe索引index-爱代码爱编程

例如: 将 MsgType/Cxr NoOfMsgs AvgElpsdTime(ms) 161 AM 86 30.13 171 CM 1 104

matlab核心知识点-索引index运用-爱代码爱编程

目录 1. 标量index基础 要求 一般写法 索引写法 2. 向量index基础 要求 一般写法 索引写法 3. index进阶 4. index运用 5. Why index ? 普通写法 index写法 6. 交流讨论 一个用matlab写代码的人,不会用索引,就如同不会骑自行车的人在推自行车。 matlab的很多

Python - Pandas 索引index的使用-爱代码爱编程

本文摘要: 修改索引列名 修改索引列名为id df.index.name = 'id' 修改索引起始值 自动生成的索引从100开始 df.index = df.index + 100 将数据某一列设为索引 将userid列设为索引列,inplace=True表示在原df上修改,drop=False表示保留userid列,默认删除us