索引的建立与理解(什么情况下不用?为什么?)(保姆级理解)

一:索引的建立

import pandas as pd
import sqlite3

conn=sqlite3.connect('new.db')

cur=conn.cursor()

sql='''
   create table new1(
    id INT,
          name TEXT,
          age INT
   
   )
   
'''

cur.execute(sql)
conn.commit()

sql='''
    insert into new1 values(1001,'linweiqi',19)
'''

cur.execute(sql)
conn.commit()

conn.close()

conn=sqlite3.connect('new.db')

cur=conn.cursor()

sql='''
  create index index_id on new1(id);
'''

cur.execute(sql)
conn.commit()

conn.close()

在此之中我们执行了三个sql语句,前两个sql语句分别代表数据库数据表的创建和插入一行数据(欲知基本sql语句的创建,请看作者的‘’python中使用SQLite3对数据库的基本操作(基于ubuntu操作系统)‘’一文!),第三个sql语句就是创建一个索引,具体格式如下:

create index 索引名 on 表名(列名)

ps:索引名可以随便取(至于拿来干什么下面会加以说明),表名和列名表示你想要创建索引的表和列

二:索引的避免运用情况及理解

(1):索引运用目的:

           索引主要是用来加快我们查寻表数据的速度,避免运用的几种情况也是基于运用索引之后并没有加速搜索,甚至减缓搜索速度。

(2):索引避免使用情况:

1:索引不应该用在较小的数据表上,在小数据表中与没索引状态搜索能力基本没差别,甚至更差。

2:索引不应该使用在有频繁的大批量的更新或插入操作的表上,因为每次更新后要重新索引,数据库负荷过大,如果表比较大,则严重影响数据的进出入库,以及查询速度。

(3):为什么这些情况不使用索引

1:索引搜索快的原理:

new1
 idnameageindex_id(隐形列)
1002linweiqi1191001
1001linweiqi2201002
1005linweiqi3211005

  如图所示,我们所创建的数据表是前三列,‘index_id’是我创造的列名‘id’的索引列(可以理解为是隐形列),你在实际的数据表中看不到,它储存于数据库中,为了便于理解我写了出来。

  其实我们不加索引时,搜索一行数据是要将所有的数据行全部游历一遍,然后提取出所符合的数据,而索引的本质是根据设置索引的列名(id),创造出一列与原来列(id)相对应的隐形列(index_id),然后隐形列(index_id)会根据一定的方法进行合理排序(如图中的我举例的方法是从小到大排序),搜索一行数据原理是先寻找隐形列(index_id),然后运用算法(如:二叉树等)进行搜索找出想要搜索出那一行的id=1005(假如要搜索id=1005这一行数据),然后通过函数映射找到原来列(id)中对应的id=1005那一行然后提出数据。

所以,为什么索引不应该用在较小的数据表上?

因为在数据小的表中在没有索引的时候比有索引时,检索速度更快,并且有索引中的隐形列会占据一定的内存,加上索引没有什么好处。

为什么索引不应该使用在有频繁的大批量的更新或插入操作的表上?

因为如果一张数据表插入数据时,因为隐形列会根据一定的方法来排序,插入一行相当于要隐形列又重新排列,在小数据表中可能工作量增加的不是很明显,但在多维数据表中,要全部重新排列是要花费相当大的计算量的,所以在使用在有频繁的大批量的更新或插入操作的表上,不应该加上索引

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值