- 什么是存储过程?用什么来调用?有哪些优缺点?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
调用:
1)可以用一个命令对象来调用存储过程。
2)可以供外部程序调用,比如:java程序。
优点:
1)存储过程是预编译过的,执行效率高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,可减少数据库开发人员的工作量。
缺点:移植性差
- 索引是什么?有什么作用以及优缺点?
索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构
你也可以这样理解:索引就是加快检索表中数据的方法。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引
索引的优点:第一个是可以通过创建唯一性索引,保证数据库表中每一行数据的唯一性。第二个是可以加快数据检索的速度。可以加快表和表之间的连接。在使用分组和排序子句进行数据检索时,同样可以减少分组和排序的时间。然后通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统性能。
缺点:第一个,索引可能会带来磁盘空间的开销和处理开销,可能会降低查询的性能。第二个是如果有太多的索引会让设计不稳定,第三个是如果需要检索大量的数据使用索引效率反而会更低。然后第四个是,当数据的修改需求大于检索需求时,索引反而会降低性能。
- 哪些列适合建立索引、哪些不适合建索引?什么样的字段适合建索引
一般来说,应该在这些列上创建索引:
(1)在经常需要搜索的列上,可以加快搜索的速度;
(2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
(3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
(4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
(5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
(6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
对于有些列不应该创建索引:
(1)对于那些在查询中很少使用或者参考的列不应该创建索引。
(2)对于那些只有很少数据值的列也不应该增加索引。
(3)对于那些定义为text, image和bit数据类型的列不应该增加索引。
(4)当修改性能远远大于检索性能时,不应该创建索引。
唯一、不为空、经常被查询的字段适合建索引
- 使用索引查询一定能提高查询的性能吗?为什么
通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
基于一个范围的检索,一般查询返回结果集小于表中记录数的30%
基于非唯一性索引的检索
-
IOT索引组织表:在主键索引中存储表中所有的数据。表就是索引,严格的排序的结构,记录在内部已经排好序,可用于代码查询表、全索引表等。
优点是记录排序,查找效率非常好。能够提高缓冲区缓存效率、减少缓冲区缓存访问、提高可扩展性。获取数据的工作量更小,因为获取数据更快。缺点是插入效率可能会低于堆文件。对于经常更新的表。不适合使用索引组织表,因为维护索引的开销比较大。 -
外键构建索引:为了确保数据的完整性,在对主表进行操作时,需要对参照表进行加锁操作,如果外键没有索引,查找子记录就会很慢,且参照表被锁的时间就会很长,进而使更多的操作被阻塞,甚至可能会发生死锁。
例外:如果被参照表很少被修改,或者只在某段没有其他活动的时候进行修改。不一定需要为外键构建索引,盲目地为外界构建索引可能会导致索引重复。 -
B树和B+树的区别