python学习第49天索引、元类、单例

一、索引

1、什么是索引

搜索引导, 所以是一种单独的,物理的 有序的 存储结构,用于加速查询

是mysql中一种专门的数据结构,称为key
例如: 字典 书的目录 车票上的车厢号

索引的本质原理就是通过不断地缩小查询范围,来降低io次数从而提升查询性能
强调:一旦为表创建了索引,以后的查询都会先查索引,再根据索引定位的结果去找数据

2、为什么用索引

因为项目运行中,查询操作非常频繁,为了提高用户体验,要提高查询的速度,
如何提高就靠索引

索引的影响:

             1.加速查询
             2.降低写入(增加 删除 修改)速度
             3.会额外占用磁盘空间

3、怎么用索引

先了解索引的原理和数据结构http://www.cnblogs.com/linhaifeng/articles/7274563.html#_label3

(1)聚焦索引

通常我们所说的主键

 特点:叶子节点存放的一整条数据

(2)辅助索引:除了主键的索引

特点:
如果是按照这个字段创建的索引,
那么叶子节点存放的是:{名字:名字所在那条记录的主键的值}

覆盖索引:只在辅助索引的叶子节点中就已经找到了所有我们想要的数据

(3)mysql中的索引:主键、外键、index索引

举个例子来说,比如你在为某商场做一个会员卡的系统。

这个系统有一个会员表
有下列字段:
会员编号 INT
会员姓名 VARCHAR(10)
会员身份证号码 VARCHAR(18)
会员电话 VARCHAR(10)
会员住址 VARCHAR(50)
会员备注信息 TEXT

那么这个 会员编号,作为主键,使用 PRIMARY
会员姓名 如果要建索引的话,那么就是普通的 INDEX
会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)

#除此之外还有全文索引,即FULLTEXT
会员备注信息 , 如果需要建索引的话,可以选择全文搜索。
用于搜索很长一篇文章的时候,效果最好。
用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
但其实对于全文搜索,我们并不会使用MySQL自带的该索引,而是会选择第三方软件如Sphinx,专门来做全文搜索。

(4)索引的两大类型hash与btree

#我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)

#不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

(5)创建/删除索引的语法

#方法一:创建表时
      CREATE TABLE 表名 (
                字段名1  数据类型 [完整性约束条件…],
                字段名2  数据类型 [完整性约束条件…],
                [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                );


#方法二:CREATE在已存在的表上创建索引
        CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                     ON 表名 (字段名[(长度)]  [ASC |DESC]) ;


#方法三:ALTER TABLE在已存在的表上创建索引
        ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                             索引名 (字段名[(长度)]  [ASC |DESC]) ;
                             
#删除索引:DROP INDEX 索引名 ON 表名字;

(6)索引的使用

1.无论索引如何设计 无法降低范围查询的查询速度
select count(*) from usr where id > 1;
即使命中索引也无法提高效率

2.索引不应该加在值重复度很高的字段上 应该加在重复度低的字段
3. 使用and时 当 条件中出现多个索引命中时 会自定找一个区分度最高的索引来使用


4.使用or的时候 如果两边都有索引 会使用索引,但是注意 or两边都要执行 顺序依然从左往右
只有一边有索引会不会使用索引? 不会使用 无法加速查询

5.优化查询 不仅仅要加索引,sql语句也需要优化 使其能命中索引
你的条件中应该使用区别度高的索引

6.联合索引
为是什么使用它
降低资源的占用 , 降低增删改的时间 会比单个字段的索引快

建立联合索引时 应该把区分度高放最左边 区分度低的依次往右放
按照区分度的高低 从左往右 依次排列

查询中 应该优先使用左边的索引
使用and时 无所谓书写顺序 会自动找区分度最高的
注意联合索引在查询时 如果压根没用到最左侧索引 不能加速查询

正常开发时
优先使用聚集索引
再次 使用联合索引 如果你的条件不包含最左侧索引 不能加速查询 这时候就应该使用单个字段索引

创建索引:
create index 索引名称 on usr(索引字段);

猜你喜欢

转载自www.cnblogs.com/ye-hui/p/10029189.html