数据库中的索引(待完善)

一.Btree索引和Hsah索引

        在数据量较小的情况下,我们的内存完全可以存储数据库中的数据,就算是进行全表扫描也不会太慢,当表中的数据量越来越大时,索引的作用也体现出来了。

MySQL支持的索引类型:
        在MySQL中,我们的索引是在存储引擎层实现的,而不是在MySQL的服务器层实现,不同的存储引擎我们索引的方式是不同的,表示所有的存储引擎都支持所有的索引类型,即使同一种索引,在不同的存储引擎中,其实现的方式也可能不同。

B-tree索引参考文档
        B-tree索引实际上是以B+树的结构存储数据,可以加快数据的查询数据,通常情况下,索引的大小远小于表中数据的大小,我们使用索引就不用全表扫描,取而代之的是从索引的根节点开始搜索,在索引的根节点存放了指向下层索引的指针,存储引擎根据这些指针向下层进行查找,通过比较叶子节点值和查找的值就可以得到合适的指针进入下层的子节点,而这些指针实际上定义了子节点中值的上限和下限。叶子节点指向的是存储的数据而不是其他的叶子节点,在innodb中指向的是主键,在Mysysm中指向的是数据的物理地址。B-tree索引是顺序存储的,因此很适合范围查找。

在什么情况下可以使用B树索引
1.全值匹配的查询:order_sn = ‘97831256548717’
2.匹配最左前缀的查询:当我们在订单号和日期上联合索引,我们需要查询某一个日期的订单时
3.匹配列前缀的查询::order_sn like ‘9783%’
4.匹配范围值的查询:order_sn > ‘987361782378’ and order_sn < '98730000000 ’
5.精确匹配左前列并且范围匹配另外一列:精确匹配order_sn,而order_date是一个范围查找
6.只访问索引的查询

B树索引的使用限制
1.如果部署按照索引最左列开始查找,则无法使用索引:以前面订单号和订单日期所建立的联合索引为例,如果索引列的顺序是先订单号后订单日期,我们可以使用这个索引,但是我们先查订单日期再订单号,就无法使用这个索引。
2.使用索引时不能跳过索引中左边的列:比如我们有3列(1,2,3)所组成的联合索引,我们在使用1,3时,由于跳过了2,因此没有办法使用到3.
3.Not in 和<> (不等于) 操作无法使用索引
4.如果查询中有某个列的范围,则其右边所有列都无法使用索引

Hash索引
        MEMORY搜索引擎是支持Btree和哈希索引的,并且在默认情况下,使用的是Hash索引。Hash索引是基于Hash表实现的,只有查询条件精确匹配Hash索引中所以列时,才能够使用到Hash索引。(只能等值查询)对于Hash索引中所有列,存储引擎都会为每一行计算一个Hash码,Hash索引中存储的就是Hash码。

Hash索引的限制
1.Hash索引查找数据必须执行两次读取,Hash索引中只包含键值,hash码和行的指针,并没有保存字段的值,所以我们在使用hash索引时必须先通过hash索引先找到对应的行,再对行的记录进行读取。但是无论是MEMERY或者INNODB中被频繁访问到的行,基本上都是缓存再内存中的,内存中的行数据访问的速度会非常快,因此大部分情况下这一点对性能的影响不会太明显。
2.Hash索引无法用于排序
3.Hash索引不支持部分索引查找也不支持范围查找
4.Hash索引可能会产生Hash冲突,即不同的行通过计算得出的Hash索引的值相同,这种情况是无法避免的。一旦产生了大量的冲突,会影响性能,因此Hash索引不适合用在选择性很差的列上(重复值多----比如性别)。

为什么要使用索引
1.索引大大减少了存储引擎所需要扫描的数据量
2.索引可以帮我们进行排序以避免使用临时表
3.索引可以把随机I/O转化为顺序I/O

索引是不是越多越好
不是的,索引虽然可以加快查找的速度,但是也会给我们的性能带来一定的损耗,只有当索引帮助存储引擎快速查找所带来的好处大于其所带来的消耗时,这时候的索引才是有效的。
索引带来的损耗:
1.索引会增加写操作的成本:innodb有插入缓存,会把几次插入放在一次执行(写)
2.太多的索引会增加查询优化器的选择时间(读)

索引的优化策略:
可以先下载sakila数据库(http//:download.mysql.com/docs/sakila-db.tar.gz)
解压资源:tar-zxf sakila-db.tar.gz
我们要导入下面两个文件:
mysql -uroot -p<sakila-schema.sql-----记录了sakila数据库中数据库的表结构
mysql -uroot -p<sakila-data.sql

索引优化策略

1.索引列上不能使用表达式或者函数
select…from product where to_days(out_date----索引列)(函数)-to_days(current_date)<=30
我们先要修改这条sql
select…from product where out_date(索引列) <= date_add(current_date,interval 30 day)----索引优化策略
2.前缀索引和索引列的选择性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值