MySQL中的排序
曾经以为filesort是文件排序,后来知道这仅仅是一个排序,文件只是路人甲而已
前些日子从china-pub上买了《Mysql核心内幕》,当浏览到第4章时,以前对MySQL的排序,join buffer不理解的地方,忽然觉得懂了,只是不知道这个懂了是真懂了还是假懂了。
就如当你从一个梦中醒来,难道你就确认你一定不是在做梦了吗?
说说看了什么吧,
filesort排序算法是将一组记录或元素按照快速排序算法放入到内存缓存,然后这几个内存缓存按合并排序算法排序。(摘自《Mysql核心内幕》第82页)
filesort有两种模式:
1、直接模式,将已经数据完全读取出来,然后进行排序
2、指针模式,先根据过滤条件取出排序字段(sort_key)和可以行指针信息(row_id),根据sort_key排序后,再依据row_id取出取出查询中所请求的其他字段。
第一种算法的优势是减少了数据的二次访问,当然会消耗更多的内存,在算法上来讲是以空间换时间。
MySQL会尽量采用每一种方式,只有在每一种方式不行的情况下才会采用第二种方式(即指针模式)
然后是MySQL的三种排序方法:
1、使用索引排序
2、在单表上使用filesort排序
3、先使用临时表,再使用filesort排序
(摘自《Mysql核心内幕》第83页)
标签归档:数据库
存储过程和触发器
存储过程和触发器
【存储过程的定义】
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
【存储过程的优点】
1、更快的速度
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2、代码重用,避免代码冗余
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
开发人员进行数据库操作时,仅需要调用定义好的存储过程就可以了
3、提高安全性
一些敏感的数据直接在数据层完成,数据层可以对其进行权限控制,提高安全性
【触发器】
google得如下文章:
地址:http://fishermen.javaeye.com/blog/24026
触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
【 强化约束 Enforce restriction】
触发器能够实现比CHECK 语句更为复杂的约束。
【跟踪变化Auditing changes】
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
【级联运行 Cascaded operation】
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
【存储过程的调用 Stored procedure invocation】
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
fishermen已经说得差不多了,补充一点:触发器也好,存储过程也好,这些都是一堆SQL,只是将一些业务流程、控制流程或基于规则的数据和业务控制功能封装在数据库层
视图的定义及其4个优点
视图的定义及其4个优点
【视图的定义】
视图是从一个或几个基本表(或视图)导出的表,它是一个虚表。数据库中存储了视图的定义,视图所显示的数据依然存放在原来的基本表中。
视图和基本表一样可以被查询、删除。在一个视力之上再定义新的视图,此时对视图的更新操作(增加,删除,修改)操作则有一定的限制
ps: 个人觉得视图是一个类似于窗口或接口性的东西
【简化用户操作】
视图可以将用户的注意力集中到所关心的数据上。可以通过定义视图让数据库看起来结构简单清晰,并且可以简化用户的查询操作
【聚集数据】
视图可以让不同的用户以不同的方式看待同一数据,特别是当许多不同的用户共享同一个数据库时
【一定程度的松耦合】
定义视图可以在一定程度上保持基本表的物理独立性,当修改数据的基本表时,只需要修改视图的定义而不用修改用户的应用程序;这里的不影响只是一定程度上的,当应用程序中有修改数据的操作时,则可能需要修改应用程序。这在一定程序让保证了数据的逻辑独立性。
【一定程序的安全保护】
由于视图的聚集数据的作用,对不同的人定义不同的视图,保证用户只能看到他可以看到的数据。也就是说,通过视图将要保密的数据对无权查看地的用户隐藏起来,从而在一定程度上对数据朝代安全保护。