数据库的常见问题

数据库常见问题
一、数据库是什么
1.为什么会有数据库
平常我们在存储的时候大多使用的是文件,但是文件存储不利于我们进行查询、也不利于我们存储大量的数据,安全性也不能保证,所以我们有了数据库
2.是什么
数据库就是为了解决这些问题而存在的,它是存储并且能更好的管理海量数据的一个存放数据的仓库。
二、MySQL常见的两种存储引擎
首先存储引擎是数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据的实现方法。
1.MyISAM
(1)定义:对于MySQL的存储引擎,早期的时候是只有MyISAM的,这个存储引擎性能极佳,提供了大量的全文索引、压缩等等,但是它不支持事务和行级锁,而且最大的缺陷就是崩溃以后无法进行安全恢复。但是在5.5以后MySQL就引入了InnoDB这种存储引擎。
(2)特点:
不支持行锁
不支持事务
不支持外键
不支持崩溃以后的恢复
支持全文索引
2.InnoDB
(1)它的与MyISAM最大的不同就是它支持了ACID兼容的事务功能,当我们出现错误的时候可以进行回滚。
(2)InnoDB的特点
支持行锁
支持事务
支持外键
支持崩溃后的安全恢复
不支持全文索引
3.两者的对比
(1)count运算上的区别:因为MyISAM缓存有表meta-data,因此在做count的时候对于结构较好的查询不需要消耗多少资源,但是InnoDB没有这种缓存。
(2)MyISAM不支持事务,但是InnoDB支持事务;MyISAM支持全文索引,但是InnoDB不是支持全文索引。
(3)MyISAM不支持外键,但是和InnoDB支持;
所以我们的MyISAM更加的适合读密集的表,InnoDB更适合于写密集的表。
三、MySQL数据库的索引
1.为什么会存在?
我们使用数据库就是为了更加高效的管理我们的数据,在实际中我们的数据一般都是比较多的数据,现在更是海量的数据,对于这么多的数据,如果我们使用的管理方法不合适,需要对它进行查询的话就会需要很多的时间;所以索引就是为了解决这样的问题。
2.索引是什么?
索引就是可以在不需要加内存、不需要修改程序、不需要调正sql就能提高数据库查询的性能的一种数据结构,但是对于数据库插入删除、更新的速度是会大大降低的。所以索引的价值就在于提高海量数据查询的效率。
3.怎么实现?(基本原理)
对于不同的存储引擎数据库的索引实是不同的。
(1)MyISAM索引实现
在MyISAM引擎中使用的是B+Tree作为索引结构的,叶节点的data域存放的是数据记录的地址。下面是MyISAM索引的原理图:
在这里插入图片描述

这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引在结构上面没有任何区别,只是主键索引要求是唯一的,而辅助索引的key可以是重复的。
如果我们在Col2上面建立一个辅助索引,则:
在这里插入图片描述

因此,MyISAM中索引的算法首先按照B+Tree搜索算法进行搜索索引,如果指定的key存在,则取出data域的值。
(2)InnoDB索引实现
虽然InnoDB也使用B+Tree作为索引结构,但是具体的实现与MyISAM截然不同。
第一个区别:InnoDB的数据本身就是索引文件,但是MyISAM索引文件和数据文件本身是分离的,索引文件仅保存数据记录的地址。而InnoDB是,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
在这里插入图片描述
上图是InnoDB主索引,可以看到叶节点包含了完整的数据记录。这种索引叫做聚焦索引。因为InnoDB的数据文件本身要按主键聚焦,所以InnoDB要求必须有主键,如果没有显示执行,则MySQl系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在它会自动生成一个隐含字段作为主键,这个字段长6个字节,类型是长整形。
第二个区别:MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。就是说:InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义Col3的一个辅助索引:
在这里插入图片描述
这里以英文字符的ASCII码作为比较准则。聚焦索引这种实现方式使得主键的搜索十分高效,但是辅助索引搜索需要检索两边索引:首先检索辅助索引获得主键,然后通过主键索引中检索获得记录。
因此。我们在使用过长字段作为主键在InnoDB中不是特别的好,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

4.索引使用策略及优化

策略——
对于MySQL优化主要分为结构优化和查询优化。
(1)联合索引(符合索引)
联合索引:相对于一般索引只有一个字段,联合索引可以为多个字段创建一个索引。它的原理就是:比如我们在(a,b,c)字段上创建一个联合索引,则索引记录会先按照A字段排序,再按照B字段排序再按照C字段排序。
因此联合查询的特点:
*第一个字段一定是有序的
*当第一个字段值相等的时候,第二个字段肯定是有序的, 比如下表中当A=2时所有B的值是有序排列的,依次类推,当同一个B值得所有C字段是有序排列的
在这里插入图片描述
其实联合查询就像是查字典一样,根据第一个字母查询第二个字母,根据第二个字母查询第三个字母,这个就是最左前缀原理。

优化——
*最左前缀匹配原则;
*主键外键一定要创建索引
*对where ,on, group by,order by中出现的列使用索引;
尽量选择区分度度高的类作为索引, 区分度的公式是count(distinct col)/count(),表示字段不重复的比例,比例越大扫描的记录数越少,唯一键的区分度是1.
*尽量的扩展索引不要新建索引

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值