zoukankan      html  css  js  c++  java
  • mysql优化概述2

    一、索引的概念
    利用关键字,就是记录的部分数据(某个字段,某些字段,某个字段的一部份),建立与记录位置的对应关系,就是索引。索引的关键字一定是排序的。
    
    二、索引的类型
    mysql支持四种索引:
    1、主键索引
    2、唯一索引
    3、普通索引
    4、全文索引
    
    无论任何形式的索引,都是通过建立关键字与位置的对应关系来实现的。
    差异:对索引关键字的要求不同。
    关键字:记录部分数据(某个字段,某些字段,某个字段的一部份)
    
    普通索引(index):对关键字没有要求
    唯一索引(unique index):要求关键字不能重复,同时增加唯一约束。
    主键索引(primary key):要求关键字不能重复,同时不能为NULL。
    全文索引(fulltext key):关键字的来源不是所有字段的数据,而是从字段中提取的特别关键字。
    
    *如果一个索引通过在多个字段上提取的关键字,称之为复合索引。
    
    三、索引的语法
    创建: 1、创建表时创建索引 create table student ( id int unsigned not null auto_increment, name varchar(32) not null default '', nickname varchar(32) not null default '', sn char(12) not null default '', desc text, primary key (`id`), --主键索引 unique index `ui_sn` (`sn`), --唯一索引 index `name_nickname` (`name`,`nickname`), --复合索引 fulltext index `fi_desc` (`desc`) --全文索引 )engine=myisam charset=utf8; 索引可以起名字,主键索引不能起名字,一个表只能有一个主键索引,其它索引可以有多个。名字可以省略,mysql自动生成。 2、更新表结构时创建索引 alter table student add primary key (`id`); alter table student add unique index `ui_sn` (`sn`); alter table student add index `name_nickname` (`name`,`nickname`); alter table student add fulltext index `fi_desc` ('desc'); *如果表中存在数据,数据符合唯一或主键的约束才能创建成功。 *auto_increment属性,依赖于key。 删除: alter table student drop primary key; alter table student drop index `ui_sn`; alter table student drop index `name_nickname`; alter table student drop index `fi_desc`; 四、索引的使用 可以通过在select语句前使用explain,来获取该查询语句的执行计划。
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    1、索引的使用场景
    索引检索:条件过滤
    索引排序:如果order by排序需要的字段上存在索引,可能使用到索引。
    索引覆盖:索引拥有的关键字内容,覆盖了查询所需要的全部数据,此时就不需要数据区获取数据,仅仅在索引区中。
    
    student表结构如下:
    
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    如果我们要查询name,nickname,和sn这三个字段:
    
    > select name,nickname,sn from student where name like 'a%';
    通过分析我们可以在ename上建立索引来提高查询效率。
    
    > alter table student add index `i_name` (`name`);
    
    > explain select name,nickname,sn from student where name like 'a%'G;
    
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    如上所示,查询确实用到了索引。
    如果我们在name,nickname和sn上建立一个复合索引,结果会是怎么样?
    
    > alter table student add index `i_nns` (`name`,`nickname`,`sn`);
    
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    如上所示,只需要检索出索引中的所有数据即可。
     
    五、索引使用的原则
    索引存在,没有满足使用原则,导致索引无效。
    1、列独立,如需要某个字段上使用索引,则字段在参与的表达式中,保证字段独立在一侧。
    
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    如上所示,id+1=5 就不是独立列,所以没有使用索引。
    
    2、左原则
    LIKE:所匹配的关键字必须在左边,如果通配符出现在左边将不能使用索引。
    
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    复合索引:仅仅针对左边字段有效果
    
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    3、OR的原则
    必须要保证两端的条件都存在可以使用的索引,才能使用到索引。
    
    mysql优化概述2 - 怀素真 - 因上努力 果上随缘
    4、mysql智能选择
    即使满足了如上的原则,mysql也不一定会使用索引。
    弃用索引的主要原因:查询即使使用索引,会导致出现大量的随机IO,相对于数据记录从第一条遍历到最后一条的顺序IO开销,还要大。
    
  • 相关阅读:
    自定义MyBatis
    SpringMVC基本
    Struts2访问Servlet
    Struts2的配置
    Rust开发环境搭建
    android webview和 javascript 进行交互
    C#开发step步骤条控件
    如何用cmd命令递归文件夹中的所有特定文件,拷贝到另一个文件夹中
    C#用DesignSurface实现一个简单的窗体设计器
    Roslyn如何实现简单的代码提示
  • 原文地址:https://www.cnblogs.com/jkko123/p/6294664.html
Copyright © 2011-2022 走看看