一、MySQL数据库的存储原理
存储过程是一个可编程的函数,它在数据库中创建并保存,它可以有SQL语句和一些特殊的控制结构组成。
当希望在不同的应用程序或者平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
-
存储过程通常有以下优点:
- 存储过程能实现较快的执行速度。
- 存储过程允许标准组件是编程。
- 存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
- 存储过程可被作为一种安全机制来充分利用。
- 存储过程能够减少网络流量。
二、数据库索引?
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,否则逻辑读会很高,性能很差。