mysql索引关键底层实现

1.性能测试脚本

#!/bin/bash

HOSTNAME="IP"
PORT="3306"                 
USERNAME="root"             
PASSWORD=""                 
                            
DBNAME="database"       
TABLENAME="tablename"
for((i=1;i<=1000000;i++));  
do   
    insert_sql="insert into ${TABLENAME} values('$i+testtsestrststt',$i)"
mysql -h${HOSTNAME}  -P${PORT}  -u${USERNAME}   ${DBNAME} -e  "${insert_sql}"  

done  

2.索引的本质以及原理

建立数据库,数据库信息如下

字段名               数据类型              大小
id (Primary key) Unsigned INT   4 bytes
firstName        Char(50)             50 bytes
lastName         Char(50)           50 bytes

emailAddress     Char(100)        100 bytes

表名person_tb

person_tb中有5000000行数据,每行记录r=204kb而且使用MyISAM引擎存储(默认数据块大小,1024kb/块,数据库数据在磁盘上是以块为单位进行数据存储),每个磁盘块存储记录=1024/204=5条记录,person_tb磁盘数目=5000000/5=1000000块。

如果现在根据字段lastName查询数据,这时候没有加索引,需要每个磁盘块都要加载一次,总共1000000次IO操作,性能很差劲了。

-------------------------------------------------

建立了一个长R = 54字节的索引,并且使用默认磁盘块大小为1,024字节。那么该索引的块因子为bfr = (B/R) = 1024/54 = 18 条记录每磁盘块。容纳这个索引表总共需要的磁盘块为N = (r/bfr) = 5000000/18 = 277,778 块。

------------------------------------------------

现在使用FirstName字段来进行搜索就可以利用索引来提高性能。这允许使用一个二分查找,平均log2 (277778) = 18.08 -> 19次数据块访问。找到实际记录的地址,这需要进一步的块读取,这样总数达到19 + 1 = 20次数据块访问,这和非索引表的数据块访问次数有天壤之别。

根本原理总结:通过不断的缩小查询范围,同时把随机的事件变成顺序的事件,也就是不断的通过一种查询方式来获取数据

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

https://blog.csdn.net/qq_37350706/article/details/81707862


https://www.cnblogs.com/effortscodepanda/p/7631722.html


https://blog.csdn.net/qq939782569/article/details/87344602


alter user 'root'@'localhost' identified with mysql_native_password by '123456';   https://www.cnblogs.com/zichuan/p/9203129.html


  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值