doraemon的python 索引原因和索引命中

### 10.6 索引

#### 10.6.1 索引的原理

什么是索引

- 就是建立起的一个在存储表阶段
- 就有的一个存储结构能在查询的时候加速

索引的重要性

- 读写比例:10:1  读的速度就至关重要

索引原理

- block 磁盘预读原理
  - for line in f

数据库的存储方式

- 新的数据结构————树
- 平衡树 balance tree - b树
  - 每个节点(分支点和节点)不仅存储关键字还存储数据
- b+树:在b树的基础上进行了改良变成b+树:
  - 1.分支节点个根节点都不在存储实际的数据了,让分支和根节点能存储更多的索引的信息,就降低了树的高度,所有的实际数据都存储在叶子节点中
  - 2.在叶子节点之间加入了双向的链式结构,方便在查询中的范围条件
- mysql当中所有的b+树索引的高度基本都控制在3层
- 什么会影响索引的效率——树的高度
  - 1.对哪一列创建索引,选择尽量短的列做索引
  - 2.对区分度高的列建索引,重复率超过了10%那么不适合创建索引

聚集索引和辅助索引

- 在innodb中 聚集索引和辅助索引并存的
  - 聚集索引--主键(快):数据直接存储在树结构中的叶子节点
  - 辅助做引--除了主键之外的所有索引都是辅助索引(慢):数据不直接存储在树种,而是留下一个主键(比如数据前面的id)与其数据链接
- myisam中 只有辅助索引

如何创建索引:create index 索引名字 on 表(字段)

删除索引:drop index 索引名 on 表名字

索引的种类

- primary key 主键 聚集索引 约束的作用:非空+唯一
- unique 自带索引 辅助索引 约束的作用:唯一
- index 辅助索引  没有约束作用

索引是如何发挥作用的

select * from 表 where id =xxx

- 在id字段没有索引的时候效率低
- 在id字段有索引之后,效率高

#### 10.6.2 索引的命中

索引不生效的原因:

- 要查询的数据范围大
  - < >= <= !=
  - between and
  - like
    - 结果的范围大,索引不生效
    - 如果a
    - abc%索引生效,%abc索引就不生效
- 如果一列内容区分度不高,索引页不生效
- 索引列不能再条件中参与计算
  - select * from s1 where id*10 = 1000000  索引不生效
- 对两列内容进行查询
  - and:
    - select * from s1 where id = 1000000 and email = ‘[email protected]‘;
    - and条件两端的内容,优先选择一个有索引的,并且树形结构封号的,来进行查询
    - 两个条件都成立才能完成where条件,先完成范围小的缩小后面的条件的压力
  - or :
    - or条件的,不会进行优化,只是根据条件从左到右依次筛选
    - 条件中带有or想要命中索引,这些条件中的所有列都必须是索引列
    - select * from s1 where id =1000000 or email = ‘[email protected]‘

联合索引

在联合索引中如果使用了or条件索引就不能生效

- create index ind_mix on s1(id,email)
- select * from s1 where id = 1000000 and email = ‘[email protected]‘;
- select * from s1 where id =1000000 or email = ‘[email protected]‘

最左前缀原则:在联合索引中,条件必须含有在创建索引的时候的第一个索引列(id,name,email),即必须含有id去查询

- select * from s1 where id =1000000;  命中索引
- swlect * from s1 where email = ‘[email protected]‘; 不能命中索引

在整个条件从出现模糊匹配开始的那一刻,索引就生效了(<>%都是模糊索引)

- select * from s1 where id<1000000 and email like ‘eva%‘   未命中
- select * from s1 where id=1000000 and email like ‘eva%‘   未命中

什么时候用联合索引:

- 只对a或者abc条件进行索引,而不会对b对c进行单独索引

什么时候使用单列索引:

- 选择一个区分度高的列建立索引,条件的范围尽量小,条件中的列不要参与计算,使用and作为条件的连接符 

覆盖索引

- 如果我们使用索引作为条件查询,查询完毕之后,不需要回表查,覆盖索引
- 例如:select id from s1 where id =1000000
- 执行计划:explain select id from s1 where id =1000000

什么是索引合并:

对两个字段分别创建索引,由于sql的条件让两个索引同时生效了,那么这个时候这两个索引就成为了合并索引

### 10.7 数据备份和事务:

在命令行中进行,不是数据库

mysqldump -uroot -p123 day40 > D:\code\day40.sql

事务:

- begin; #开启事务
- select * from emp where id = 1 for update; #查询id值,for update添加行锁;
- update emp set salary=10000 where id = 1; 完成更新
- commit; #提交事务

### 10.8 sql注入

--    注释掉--之后的语句   万一别人在用户登录的时候在username中输入了这个,相当于注释掉了后面的密码

解决办法:

```python
import pymysql
conn = pymysql.connect(host=‘127.0.0.1‘,user=‘root‘,password=‘123‘,database=‘day41‘)
cur = conn.cursor()
username = input(‘>>>‘)
password = input(‘>>>>‘)
sql = "select * from userinfo where name = %s and password=%s"
cur.execute(sql,(username,password))   #不要自己拼接sql语句,将占位符的处理任务交给execute处理
print(cur.fetchone())
conn.close()
```

原文地址:https://www.cnblogs.com/doraemon548542/p/11495109.html

时间: 2024-10-31 20:50:35

doraemon的python 索引原因和索引命中的相关文章

python小白之数组索引

索引 numpy中的数组索引形式和Python是一致的.如: np.arange(10) print x[2]  #单个元素,从前往后正向索引.注意下标是从0开始的. print x[-2]  #从后往前索引.最后一个元素的下标是-1 print x[2:5]  #多个元素,左闭右开,默认步长值是1 print x[:-7]  #多个元素,从后向前,制定了结束的位置,使用默认步长值 print x[1:7:2]  #指定步长值 x.shape=(2,5)  #x的shape属性被重新赋值,要求就

联合分组、子查询、视图、事务、python操作mysql、索引

目录 联合分组.子查询.视图.事务.python操作mysql.索引 一.联合分组 二.子查询 三.all 与any:区间修饰条件 四.视图:view 视图的增删改 五.事务 5.1.事务的概念 5.2.事务的四大特性 六.pymysql 模块:python操作mysql 6.1 安装pymysql 模块 6.2 python用pymysql 操作mysql步骤 6.3 游标操作 6.4 pymysql事务 6.5 sql注入 七.索引 联合分组.子查询.视图.事务.python操作mysql.

python之路-利用索引切片功能做一个简易的两个未知数的加法计算器,代码如下:

python之路-利用索引切片功能做一个简易的两个未知数的加法计算器,代码如下: #content = input('请输入内容:'),如用户输入:5 +9或 5 + 9 等,然后进行分割再进行计算. content = input('>>>').strip() #content 等于所输入的内容,strip:删除字符串左右两边的空格. index = content.find('+') ''' content内容中的两边的空格都删除了,但中间还有,现在我们只需要定位已知内容是加法,两边

DB索引、索引覆盖、索引优化

###########索引########### @see   http://mp.weixin.qq.com/s/4W4iVOZHdMglk0F_Ikao7A 聚集索引(clustered index):聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引,一般用primary key来约束. 举例:t_user场景中,uid上的索引. 非聚集索引(non-clustered index):它并不决定数据在磁盘上的物理排序,索引上只包含被建立索引的数据,以及一个行定位符row-loca

数据库中的聚集索引、非聚集索引、优化索引

这篇文章我们来讨论一下索引的问题吧,这篇文章不会介绍怎么创建索引,但是会介绍怎么优化索引. 什么是索引? 索引是对记录按照多个字段进行排序的一种方式.对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值又指向与它相关的记录.这种索引的数据结构是经过排序的,因而可以对其执行二分查找. 怎么理解索引呢?我们经常用在windows系统下,查询某些文件,系统都会建议我们建立文件的索引.比如,如果你要查询一个文件名,系统要扫描所有文件进行傻瓜式地扫描,速度当然会很慢.当我们建立了索引后

索引和唯一索引的区别

索引是我们经常使用的一种数据库搜索优化手段.适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验.在Oracle中,索引有包括很多类型.不同类型的索引适应不同的系统环境和访问场景.其中,唯一性索引Unique Index是我们经常使用到的一种. 唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束.添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的. 那么,在使用唯一性索引时,同一般索引有什么差异呢?下

索引:位图索引理解

文章转载自  http://www.360doc.com/content/14/0508/15/11965070_375805586.shtml 1. 案例 有张表名为table的表,由三列组成,分别是姓名.性别和婚姻状况,其中性别只有男和女两项,婚姻状况由已婚.未婚.离婚这三项,该表共有100w个记录.现在有这样的查询:     select * from table where Gender='男' and Marital="未婚"; 姓名(Name) 性别(Gender) 婚姻状

SQL Server索引的维护 - 索引碎片、填充因子 &lt;第三篇&gt;

实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多),一个区中的页面可能属于多余一个的索引或表---这被称为混合区.如果数据库中有太多的小表,混合区帮助SQL Server节约磁盘空间. 随着表(或索引)增长并且请求超过8个页面,SQL Server创建专用于该表(或索引)的区并且从该区中分配页面.这样一个区被称为统一区,它可以为多达8个相同表或索引的

SQL Server索引 - 非聚集索引 &lt;第七篇&gt;

一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向新的数据页面,而不是更新所有相关非聚集索引的行定位器.这样,虽然降低了非聚集索引的维护开销,但是增加了从非聚集索引行到数据行的导航开销,因为添加了一个旧数据页面和信数据页面之间的连接.因此,将聚集索引作为行定位器降低了非聚集索引相关的开销. 二.定义书签查找 当一个查询请求不是优化器选择的非聚集索引