数据库---MySQL理论

一、MySQL数据库的存储原理

存储过程是一个可编程的函数,它在数据库中创建并保存,它可以有SQL语句和一些特殊的控制结构组成。
当希望在不同的应用程序或者平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

  • 存储过程通常有以下优点:
    1. 存储过程能实现较快的执行速度。
    2. 存储过程允许标准组件是编程。
    3. 存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
    4. 存储过程可被作为一种安全机制来充分利用。
    5. 存储过程能够减少网络流量。

二、数据库索引?

B+树:用于范围查询和单值查询,
哈希索引:用于单值查询,速度比B+树快一点,但不适合用于范围查询,它是以键值对的方式查询的,例如 name=“小张”。
位图索引:针对多个字段的简单查询,使用范围特别小,只适用于字段值固定并且值得种类很少的情况。比如性别,只能是男和女,或者级别,状态等等。

数据库的索引:就是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据。索引的实现通常使用B树或者B+树。

数据库的索引分为:普通索引(非聚集索引)、聚集索引、主键索引、唯一索引、全文索引

  • 普通索引:它的结构主要以B+树和哈希索引为主,主要是对数据表中的数据进行精确查找
  • 聚集索引:我们在表中添加数据的顺序,与我们创建的索引键值相同,而且一个表中只能有一个聚集索引。
  • 主键索引:在我们给一个字段设置主键的时候,它就会自动创建主键索引,用来确保每个值都是唯一的,例如 id 是自动创建的
  • 唯一索引:在创建唯一索引时不能给具有相同的索引值
  • 全文索引:它的作用是搜索数据表中的字段是不是包含我们搜索的关键字,就像搜索引擎中的模糊查询。
1、使用索引的优点:
  • ①、提高数据的搜索速度。
  • ②、创建唯一索引,保证数据库中每一行数据的唯一性。
  • ③、加快表与表之间的连接速度。
  • ④、在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。
2、使用索引的缺点:
  • ①、在我们建立数据库的时候,需要花费的时间去建立和维护索引,而且随着数据量的增加,需要维护它的时间也会增加。
  • ②、在创建索引的时候会占用存储空间
  • ③、在我们需要修改表中的数据时,索引还要进行动态维护,所以对数据库的维护带来了一定的麻烦。
3、应该在哪些列上使用索引?
  • ①、经常需要搜索的列。
  • ②、作为主键的列。
  • ③、经常用在连接的列,这些列主要是一些外键,可以加快连接速度。
  • ④、经常需要根据范围进行搜索的列。
  • ⑤、经常需要排序的列。
  • ⑥、经常使用where子句上面的列。
4、不应该在哪些列上使用索引?
  • ①、查询中很少使用的列
  • ②、对于哪些具有很少数据值得列;比如人事表的性别列。
  • ③、对于哪些定义text,image的列,因为这些列的数据量相当的大。
  • ④、当对修改性能的要求远远大于搜索性能时,因为当增加索引时,会提高搜索性能,但是会降低修改性能。

三、数据库的优化方案?

  • 1、优化索引、SQL语句、分析慢查询。
  • 2、设计表的时候严格根据数据库的设计范式来设计数据库。
  • 3、使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘的 IO。
  • 4、优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAOD1,RAID5)等。
  • 5、采用MySQL内部自带的表分区技术,把数据分成不同的文件,能够提高磁盘的读取效率。
  • 6、垂直分表;把一些不经常读的数据放在一张表里,节约磁盘的 IO。
  • 7、主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来。
  • 8、分库分表分机器(数据量特别大),主要的原理就是数据路由选择合适的表引擎,参数上的优化。
  • 9、进行架构级别的缓存,静态化和分布式。
  • 10、不采用全文索引。
  • 11、采用更快的存储方式,例如 NoSQL存储经常访问的数据。

四、数据库怎么优化查询效率?

  • 1、存储引擎的选择:如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的。
  • 2、分库分表,主写从读。
  • 3、对查询进行优化,要尽量避免全表扫描,首先应该考虑在where及order by设计的列上建立索引。
  • 4、尽量避免在where子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
  • 5、尽量避免在where子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
  • 6、尽量避免在where子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。
  • 7、Update语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。
  • 8、对于多张大数据量(这里几百条就算大了)的表 join ,要先分页在 join,否则逻辑读会很高,性能很差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值