精华内容
下载资源
问答
  • 数据库原理SQL简述

    2015-12-20 23:32:26
    SQL语言特点1. SQL基本功能 数据定义功能:DDL(Data Definition Language)语言来实现,可用来支持定义或建立数据库对象(如表、索引、序列、视图等),定义关系数据库的模式、外模式、内模式。(CREATE ,ALTER,DROP命令)...

    SQL语言特点

    1. SQL基本功能

    • 数据定义功能:DDL(Data Definition Language)语言来实现,可用来支持定义或建立数据库对象(如表、索引、序列、视图等),定义关系数据库的模式、外模式、内模式。(CREATE ,ALTER,DROP命令)
    • 数据操纵功能:DML(Data Manipulation Language)语言来实现,DML包括数据查询和数据更新两种。
    • 数据控制功能:DCL(Data Control language):数据控制功能,指数据的安全性和完整性。

    2. 特点

    • 语言简洁 、易学易用
    • 高度非过程化
    • SQL语言既可交互使用,也可嵌入形式使用(前者是直接对DBMS发出SQL命令,后者主要嵌入(c,c++)等宿主语言中,被程序员用来开发数据库应用程序)
    • 面向集合的操作方式:不仅查找结果可以是元组的集合,而且一次插入,删除,更新操作的对象也可以是元组的集合
    • SQL语言支持关系数据库三级模式结构
      • 内模式对应于存储文件,模式对应于基本表,外模式对应于视图

    3. SQL语言分类简介

    SQL功能所使用的动词
    数据定义CREATE,DROP,ALTER
    数据查询SELECT
    数据操纵INSERT,UPDATE,DELETE
    数据控制GRANT,REVOKE

    数据定义语言

    动词功能
    CREATECREATE DATABASE, CREATE TABLE, CREATE VIEW, CREATE INDEX
    DROPDROP DATABASE,DROP TABLE,DROP VIEW,DROP INDEX
    ALTERALTER TABLE

    4. 索引的定义与维护功能

    建立索引的原则

    1. 索引的建立与维护由DBA和DBMS完成。
    2. 大表应当建索引,小表不必建索引,一个基本表,不宜建较多的索引
    3. 根据查询要求建立索引。对于一些查询频度较高,实时性要求高的数据一定要建立索引

    建立索引

    例如:

    create unique index Susno ON Student(Sno);
    create unique index Coucno ON Course(Cno);
    create unique index Scno ON SC(Sno ASC,Cno DESC)

    一般情况下自动为主键列建立索引,且建立索引为聚簇索引

    删除索引

    DROP INDEX SCno

    展开全文
  • SQL Server 2014推出的的新索引类型叫做 hash index。介绍hash index之前一定要介绍哈希函数这样会让大家更明白哈希索引的原理,有需要的朋友可以参考下
  • Sql注入基本原理

    万次阅读 多人点赞 2018-07-29 11:19:27
    SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。

    1、什么是Sql注入攻击

     SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。

     本课程将带你从介绍 Web 应用运行原理开始,一步一步理解 Sql 注入的由来、原理和攻击方式。

    2、Web程序三层架构

     三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

    界面层(User Interface layer)

    业务逻辑层(Business Logic Layer)

    数据访问层(Data access layer)。

    这里写图片描述

     区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。

    3、Sql注入产生原因及威胁

     刚刚讲过当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。 这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

    Sql 注入带来的威胁主要有如下几点

    • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
    • 绕过认证,列如绕过验证登录网站后台。
    • 注入可以借助数据库的存储过程进行提权等操作

    4、判断Sql注入点

    4.1 判断是否存在sql注入漏洞

     通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX 对 Sql 注入的判断,主要有两个方面:

    • 判断该带参数的 Url 是否存在 Sql 注入?
    • 如果存在 Sql 注入,那么属于哪种 Sql 注入?

     可能存在 Sql 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的 动态网页且此网页访问了数据库,那么就有可能存在 Sql 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

     最为经典的单引号判断法: 在参数后面加上单引号,比如:

    http://xxx/abc.php?id=1'

     如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。 (如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入,因为此为入门基础课程,就不做深入讲解了)

    4.2 判断Sql注入漏洞的类型

     通常 Sql 注入漏洞分为 2 种类型:

    • 数字型
    • 字符型

     其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

    4.2.1 数字型判断

     当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下: select * from <表名> where id = x 这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

     Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
     Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。
     原因如下: 当输入 and 1=1时,后台执行 Sql 语句:

    select * from <表名> where id = x and 1=1

     没有语法错误且逻辑判断为正确,所以返回正常。

     当输入 and 1=2时,后台执行 Sql 语句:

    select * from <表名> where id = x and 1=2

     没有语法错误但是逻辑判断为假,所以返回错误。 我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

    select * from <表名> where id = 'x and 1=1' 
    select * from <表名> where id = 'x and 1=2'

     查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

    4.2.2 字符型判断

     当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下: select * from <表名> where id = ‘x’ 这种类型我们同样可以使用 and ‘1’=’1 和 and ‘1’=’2来判断:

     Url 地址中输入 http://xxx/abc.php?id= x’ and ‘1’=’1 页面运行正常,继续进行下一步。
     Url 地址中继续输入 http://xxx/abc.php?id= x’ and ‘1’=’2 页面运行错误,则说明此 Sql 注入为字符型注入。

     原因如下: 当输入 and ‘1’=’1时,后台执行 Sql 语句:

    select * from <表名> where id = 'x' and '1'='1'

     语法正确,逻辑判断正确,所以返回正确。

     当输入 and ‘1’=’2时,后台执行 Sql 语句:

    select * from <表名> where id = 'x' and '1'='2'

     语法正确,但逻辑判断错误,所以返回正确。同学们同样可以使用假设法来验证。

    5、Sql注入实例

    5.1 绕过登陆

     我们正常的登陆是输入用户名密码到后台数据库判断用户名密码是否正确,看看后台代码是如何实现的

    select * from user where username = '$name' and password = '$pwd'"

     用户名密码都输入123,实际执行的sql语句是:

    select * from users where username='123' and password='123'

     我们尝试在用户名中输入 123’ or 1=1 #, 密码同样输入 123’ or 1=1 #显示登陆成功,为什么会登录成功呢,我们来看看实际执行的sql语句

    select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'

     按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):

    select * from users where username='123' or 1=1

     由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。 我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式: 我们尝试在用户名中输入 123’ or ‘1’=’1, 密码同样输入 123’ or ‘1’=’1 (不能少了单引号,否则会有语法错误): 此处输入图片的描述 此处输入图片的描述 实际执行的 Sql 语句是:

    select * from users where username='123' or '1'='1' and password='123' or '1'='1`

     看到了吗?两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。

     还有通过sql语句注入来获取隐私信息,所以sql注入需要引起程序员们的注意。

    6、预防Sql注入的方法

     下面我针对JSP,说一下应对方法:

    (1)(简单又有效的方法)PreparedStatement

     采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

    使用好处:

     (1).代码的可读性和可维护性.

     (2).PreparedStatement尽最大可能提高性能.

     (3).最重要的一点是极大地提高了安全性.

    原理:

     sql注入只对sql语句的准备(编译)过程有破坏作用 ,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理, 而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

    (2) 使用正则表达式过滤传入的参数

     要引入的包:

    import java.util.regex.*; 

     正则表达式:

    private String CHECKSQL = “^(.+)\sand\s(.+)|(.+)\sor(.+)\s$”; 

     判断是否匹配:

    Pattern.matches(CHECKSQL,targerStr); 

     下面是具体的正则表达式:

     检测SQL meta-characters的正则表达式 :

    /(\%27)|(\’)|(–)|(\%23)|(#)/ix 

     修正检测SQL meta-characters的正则表达式 :

    /((\%3D)|(=))[^\n]*((\%27)|(\’)|(–)|(\%3B)|(:))/i 

     典型的SQL 注入攻击的正则表达式 :

    /\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix 

     检测SQL注入,UNION查询关键字的正则表达式 :

    /((\%27)|(\’))union/ix(\%27)|(\’) 

     检测MS SQL Server SQL注入攻击的正则表达式:

    /exec(\s|+)+(s|x)p\w+/ix 

     等等…..

    (3) 字符串过滤

     比较通用的一个方法:

     (||之间的参数可以根据自己程序的需要添加)

    public static boolean sql_inj(String str) 
    { 
    String inj_str = “’|and|exec|insert|select|delete|update| 
    count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”; 
    String inj_stra[] = split(inj_str,”|”); 
    for (int i=0 ; i < inj_stra.length ; i++ ) 
    { 
    if (str.indexOf(inj_stra[i])>=0) 
    { 
    return true; 
    } 
    } 
    return false; 
    }

    (4) jsp中调用该函数检查是否包函非法字符

     防止SQL从URL注入:

     sql_inj.java代码:

    package sql_inj; 
    import java.net.*; 
    import java.io.*; 
    import java.sql.*; 
    import java.text.*; 
    import java.lang.String; 
    public class sql_inj{ 
    public static boolean sql_inj(String str) 
    { 
    String inj_str = “’|and|exec|insert|select|delete|update| 
    count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”; 
    //这里的东西还可以自己添加 
    String[] inj_stra=inj_str.split(“\|”); 
    for (int i=0 ; i < inj_stra.length ; i++ ) 
    { 
    if (str.indexOf(inj_stra[i])>=0) 
    { 
    return true; 
    } 
    } 
    return false; 
    } 
    }

    (5) JSP页面判断代码:

     使用javascript在客户端进行不安全字符屏蔽

     功能介绍:检查是否含有”‘”,”\”,”/”

     参数说明:要检查的字符串

     返回值:0:是1:不是

     函数名是

    function check(a) 
    { 
    return 1; 
    fibdn = new Array (”‘” ,”\”,”/”); 
    i=fibdn.length; 
    j=a.length; 
    for (ii=0; ii<i; ii++) 
    { for (jj=0; jj<j; jj++) 
    { temp1=a.charAt(jj); 
    temp2=fibdn[ii]; 
    if (tem’; p1==temp2) 
    { return 0; } 
    } 
    } 
    return 1;
    }

     总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。
    凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。


    关注公众号:猿小雷
    获取更多文章,第一之间掌握技术。
    有问题请在公众号内回复,小雷会一一回答。

    这里写图片描述

    展开全文
  • 数据库索引的实现原理SQL Server

    千次阅读 2016-07-06 00:19:54
    SQL Server数据库索引的实现原理

    索引使数据以一种特定的方式组织起来,从而可以提供对数据的快速访问。

    表和索引的结构

    页和分区

    SQL Server存储数据的基本单位,大小为8 KB。它可以包含表数据或索引数据,执行计划数据,分配位图,可用空间信息等。页是SQL Server可以读写的最小I/O单位。即使只访问一行,它也把整个页加载到缓存并从缓存中读取数据。涉及数据查询操作的开销通常是I/O开销。显然,物理地读取一页比从缓存中逻辑地读取一页所产生的开销要大得多。

    8个连续页组成的分配单元。当表或索引需要更多空间以存储数据时,SQL Server为该对象分配一个完整的区。但有一个例外:如果该对象不足64 KB8*8 KB()),则当需要更多空间时,SQL Server通常只为该对象分配一个完整的页,而不是整个区。该页可以位于一个混合区内,混合区内的8个页属于不同的对象。

    I/O操作中最大开销是磁臂的移动,而实际的磁读和磁写操作的开销要小得多,因此读取一个页几乎和读取整个区所用的时间一样。

    堆是不含聚集索引的表。这种结构之所以被称为堆是因为它的数据不按任何顺序存储。

    联系一个堆中的数据的唯一结构是被称为索引分配映射Index Allocation Map ,IAM的一个位图页(如果需要,可能是多个IAM)。该位图页包含指向在混合区mixed extent)分配的前八个页的指针,还包含一个大位图,每个位表示文件中4 G范围内的一个区,如果一个区不属于拥有该IAM页的对象,则标记为0,否则为1。如果一个IAM不足以覆盖该对象的所有数据,SQL Server将维护一个IAM页的链。当扫描对象时,使用IAM页遍历该对象的数据。SQL Server加载该对象的第一个IAM页,然后指示磁臂按区在磁盘上的物理顺序连续地访问他们。

    SQL Server维护指向第一个IAM页和堆中第一个数据页的内部指针。


    聚集索引

    SQL Server中所有索引都是按B+树的结构来组织的。

    聚集索引是按B+树的结构来组织的,聚集索引在叶级表中维护所有的数据。


    我们把具有聚集索引的表称为聚集表。表的完整数据行按索引键的顺序存储在索引的叶级。有一个双向链接列表用于维护这种逻辑顺序。但要注意,根据索引的碎片级别,磁盘上页的物理顺序可能和链接列表维护的逻辑顺序不匹配。

    还要注意,对于每个叶级行(元组),索引维护一个唯一标识符(unq)。该值列举具有相同键值(key value)的行,当索引的键列不唯一时,该值和键值共同唯一的标识行。

    SQL Server需要在索引的叶级别执行有序扫描(或有序局部扫描)操作时,将按链接列表进行扫描。除了链接列表,SQL Server还维护一个(或多个)IAM页以映射在磁盘上按物理顺序存储的数据。当SQL Server需要无序扫描索引的叶级别时,通常使用IAM页。有序和无序扫描的性能差异取决于索引的碎片级别。I/0操作中成本最高的部分是磁臂的移动。在没有碎片的索引中执行有序扫描与无序扫描的性能相差无几,但如果索引的碎片级别较高,则有序扫描要慢得多。

    在索引叶级别的上层,索引还维护其他的级别,每个级别都概括了它下面的级别。非叶级索引页中的每一行指向它下一级别的整个页。该行包括两个元素:1、被指向索引页的第一行的键值;2、以及一个6字节的指针,该指针包括数据库的文件号和文件中的页号。当SQL Server生成索引时,它从叶级别开始,向上添加级别。当一个级别只有一个页时停止,而该页被称为根页(root page)。

    SQL Server需要导航到位于叶级的特定键时,它总是从根页开始,并使用被称为索引查找(index seek)的访问方法。查找操作将从根“跳”到下一级别的相应页,并继续从一个级别跳到下一个级别,直到达到包含被查找键的叶级页。所有叶级页到达根的距离都是相同的,这意味着一次查找操作在页读取(page reads)方面的成本正好是索引的级数。这种读取操作的I/O模式不是连续的I/0,而是随机的I/O,因为查找操作所读取的页很少相邻。

    在性能估计时,知道一个索引的级数是非常重要的,因为这个数正好是一次查找操作在页读取方面的成本。一般而言,对于小表,大多数索引通常只有两级。对于大表(百万级),通常包含3级或4级。相对于聚集索引,非聚集索在它的叶级页可以容纳更多的行,所以相同级数的非聚集索引可以包含更多的行,因为非聚集索引的叶级行仅包含索引键列和指向特定数据行的行定位符。

    非聚集索引

    非聚集索引也是按B+树的结构来组织的,而且在许多方面都和聚集索引类似。唯一区别是非聚集索引的叶级行仅包含索引键列和指向特定数据行的行定位符行定位符的内容取决于该表是一个堆还是一个聚集表。

    堆上的非聚集索引

    非聚集索引的叶级行中指向数据行的行定位符是一个8字节的物理指针,被称为RID。它由数据库文件号,文件中的目标页号,目标页中的行号(从0开始)组成。当通过索引查找到特定行时,SQL Server必须在查找操作后执行RID lookup操作,该操作用于读取包含数据行的页。因此,RID lookup的成本是一个页读取。

    对于一次lookup或者少量lookup,它的成本并不高,但是对于大量的lookup来说,它的成本会非常高,因为SQL Server需要为找到的每个行读取页。对于使用非聚集索引的范围查询,以及一批lookup(每次符合条件的行一次lookup),lookup操作的累计成本通常构成了查询的大部分成本。


    聚集表上的非聚集索引

    与堆上的非聚集索引唯一的区别是:在聚集表上创建的非聚集索引的行定位符是一个被称为聚集键的值,而不是RID。聚集键由目标行的聚集索引值唯一标识符组成。其原理是指向逻辑的行,而不是物理的行。

    这种架构主要是为OLTP联机事务处理)系统而设计的,在这种系统下,当插入数据时聚集索引常常出现大量的页拆分。当被拆分的页中,有一半的行会被物理地移动到新分配的页。如果非聚集索引保存指向行的物理地址,所有指向这些被移动数据行的指针必须被更改以反映新的物理位置,而且对于所有非聚集索引中的相关指针也都要被更新。如果SQL Server维护逻辑指针,则物理地移动数据行时,非聚集索引上的这些指针不需要被更新。

    查找操作在非聚集索引中查找特定键,最后到达相应的叶级行并访问行定位符。这种情况下的行定位符是被指向行的聚集键,lookup操作将在聚集索引内根据得到的聚集键执行完整的查找操作。其中每次lookup操作的成本(读取页数方面)与聚集索引的级数一样高。而当表是一个堆时,RID lookup的成本只是一个页读取(page read)。当然,对于使用非聚集索引的范围查询和一系列lookup,在堆和聚集索引表中逻辑读取数之间的比例接近于L,其中L是聚集索引的级数。

    在你对此感到困惑并移除所有聚集索引之前,记住,对聚集索引执行lookup操作时,聚集索引的非叶级页通常都已经在缓存中了。通常,大多数聚集索引的物理读取是发生在叶级的。因此对聚集表的额外lookup成本相对于堆来说只占总查询成本的一小部分。




    展开全文
  • Mysql数据库原理sql优化

    千次阅读 2019-06-09 17:16:46
    1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务; 2. InnoDB支持外键,而MyISAM不支持。对...

     

    Mysql数据库结构图

    一,mysql数据库引擎介绍

    1,ISAM(Indexed Sequential Access Method):

    ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错。如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。

    注意:使用ISAM注意点:必须经常备份所有实时数据。

    2,MyISAM:

    MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。

    注意: MyISAM引擎使用注意:必须经常使用Optimize Table命令清理空间;必须经常备份所有实时数据。工具有用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。

    如果使用该数据库引擎,会生成三个文件:

    .frm:表结构信息

    .MYD:数据文件

    .MYI:表的索引信息

    3,InnoDB

    InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外键。尽管要比ISAM和MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。 

        MySQL 官方对InnoDB是这样解释的:InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。

        InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。

    InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。

    InnoDB特点:

     1)、支持事务安装

    2)、数据多版本读取

    3)、锁定机制的改进

    4)、实现外键

    innodb与myisam区别

    1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;  

    2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;  

    3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

    4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;  

    5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

    如何选择:

    1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM

    2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。

    3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;

    4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

    4,NDBCluster存储引擎

    NDB存储引擎也叫NDBCluster存储引擎,主要用于MySQLCluster分布式集群环境,Cluster是MySQL从5.0版本才开始提供的新功能。

    5,Merge存储引擎

    MERGE存储引擎,在MySQL用户手册中也提到了,也被大家认识为MRG_MyISAM引擎。Why?因为MERGE存储引擎可以简单的理解为其功能就是实现了对结构相同的MyISAM表,通过一些特殊的包装对外提供一个单一的访问入口,以达到减小应用的复杂度的目的。要创建MERGE表,不仅仅基表的结构要完全一致,包括字段的顺序,基表的索引也必须完全一致。

    6,Memory存储引擎

    Memory存储引擎,通过名字就很容易让人知道,他是一个将数据存储在内存中的存储引擎。Memory存储引擎不会将任何数据存放到磁盘上,仅仅存放了一个表结构相关信息的.frm文件在磁盘上面。所以一旦MySQLCrash或者主机Crash之后,Memory的表就只剩下一个结构了。Memory表支持索引,并且同时支持Hash和B-Tree两种格式的索引。由于是存放在内存中,所以Memory都是按照定长的空间来存储数据的,而且不支持BLOB和TEXT类型的字段。Memory存储引擎实现页级锁定。

    7,BDB存储引擎

    BDB存储引擎全称为BerkeleyDB存储引擎,和Innodb一样,也不是MySQL自己开发实现的一个存储引擎,而是由SleepycatSoftware所提供,当然,也是开源存储引擎,同样支持事务安全。

    8,FEDERATED存储引擎

    FEDERATED存储引擎所实现的功能,和Oracle的DBLINK基本相似,主要用来提供对远程MySQL服务器上面的数据的访问接口。如果我们使用源码编译来安装MySQL,那么必须手工指定启用FEDERATED存储引擎才行,因为MySQL默认是不起用该存储引擎的。

    9,ARCHIVE存储引擎

    ARCHIVE存储引擎主要用于通过较小的存储空间来存放过期的很少访问的历史数据。ARCHIVE表不支持索引,通过一个.frm的结构定义文件,一个.ARZ的数据压缩文件还有一个.ARM的meta信息文件。由于其所存放的数据的特殊性,ARCHIVE表不支持删除,修改操

    作,仅支持插入和查询操作。锁定机制为行级锁定。

    10,BLACKHOLE存储引擎

    BLACKHOLE存储引擎是一个非常有意思的存储引擎,功能恰如其名,就是一个“黑洞”。就像我们unix系统下面的“/dev/null”设备一样,不管我们写入任何信息,都是有去无回。

     

    11,CSV存储引擎

    CSV存储引擎实际上操作的就是一个标准的CSV文件,他不支持索引。起主要用途就是大家有些时候可能会需要通过数据库中的数据导出成一份报表文件,而CSV文件是很多软件都支持的一种较为标准的格式,所以我们可以通过先在数据库中建立一张CVS表,然后将生成的报表信息插入到该表,即可得到一份CSV报表文件了。

    二,操作数据库引擎

    1,查看数据库支持的引擎

    show engines;

    2,查看数据库当前默认引擎

    show variables like '%storage_engine%';

    3,查看数据表使用的引擎

    show create table table_name

    4,修改表的存储引擎

    alter table table_name engine=engine_name

    事物的隔离级别

    1. read committed(mysql的默认隔离级别)
    2. read uncommitted
    3. repeatable read(oracle 的默认隔离级别)
    4. serializable

    三,数据库索引介绍

    建立索引的优缺点:

    为什么要创建索引呢?

            这是因为,创建索引可以大大提高系统的查询性能。 
            第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
            第二、可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 
            第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
            第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
            第五、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

            也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点, 但是,为表中的每一个列都增加索引,是非常不明智的。 这是因为,增加索引也有许多不利的一个方面:

            第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 

            第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。 

            第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    什么样的字段适合创建索引:

     索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。

           一般来说,应该在这些列上创建索引,例如:

           第一、在经常需要搜索的列上,可以加快搜索的速度; 

           第二、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 

           第三、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 

           第四、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 

           第五、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 

           第六、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

             建立索引,一般按照select的where条件来建立,比如: select的条件是where f1 and f2,那么如果我们在字段f1或字段f2上建立索引是没有用的,只有在字段f1和f2上同时建立索引才有用等。

    什么样的字段不适合创建索引:

    同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:

    第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,

    并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 
           第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,

    在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 
           第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 
           第四,当修改性能远远大于检索性能时,不应该创建索 引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

    1,B-Tree索引

    B-Tree索引,顾名思义,就是所有的索引节点都按照balancetree的数据结构来存储,所有的索引数据节点都在叶节点。

    2,Full-text索引

    Full-text索引就是我们长说的全文索引,他的存储结构也是b-tree。主要是为了解决在我们需要用like查询的低效问题。

    四,创建索引

    1. 普通索引

    这是最基本的索引,它没有任何限制MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。

    1. 1接创建

    CREATE  INDEX  [index_name]  ON  [table_name] (column(length))

    修改表结构的方式添加索引

    ALTER TABLE table_name ADD INDEX index_name (column(length))

    1. 2创建表时指定索引

    CREATE TABLE test (id int not null auto_increment,title varchar(30) ,PRIMARY KEY(id) , INDEX  title_index (title))

    1. 3查看索引

    SHOW INDEX FROM  [table_name]

    SHOW KEYS FROM [table_name]

    1. 4删除索引

    DROP INDEX  [index_name]  ON [talbe_name]

    ALTER TABLE  [table_name]  DROP INDEX  [index_name]

    ALTER TABLE  [table_name]  DROP PRIMARY KEY

    1. 5唯一索引

    与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似

    1. 6直接创建

    CREATE UNIQUE INDEX [index_name]  ON [table_name] (column(length))

    1.7修改表的方式添加唯一索引

    ALTER TABLE [table_name] ADD UNIQUE [index_name]  (column(length))

    1. 8创建表时指定唯一索引

    CREATE TABLE test (id int not null auto_increment,title varchar(30) ,PRIMARY KEY(id) ,  UNIQUE  title_index (title(length)))

    1. 全文索引(FULLTEXT)

    MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。

    对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

    3.1,直接创建

    CREATE FULLTEXT INDEX index_name ON table_name(column(length))

    3.2,修改表结构的方式添加全文索引

    ALTER TABLE [table_name] ADD FULLTEXT [index_name]( column)

    3.3,创建表时指定唯一索引

    CREATE TABLE test (id int not null auto_increment,title varchar(30) ,PRIMARY KEY(id) ,  FULLTEXT  title_index (title))

    1. 组合索引(最左前缀

    CREATE  INDEX  [index_name]  ON  [table_name] (column_list)

    平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:

    –title,time

    –title

    为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:

    1,使用到上面的索引

    SELECT * FROM article  WHREE  title='测试' AND time=1234567890;

    SELECT * FROM article WHREE  title='测试';

    2,不使用上面的索引

    SELECT * FROM article WHREE time=1234567890;

    五,MySQL索引的优化

    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE次数大于查询次数时,放弃索引。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

    1. 索引不会包含有NULL值的列

    只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此组合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

    1. 使用短索引

    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    1. 索引列排序

    MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

    1. like语句操作

    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

    1. 不要在列上进行运算

    例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′

    六,索引总结

    最后总结一下,MySQL只对以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。而理论上每张表里面最多可创建16个索引,不过除非是数据量真的很多,否则过多的使用索引也不是那么好玩的

    七,SQL优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

    select id from t where num is null

    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

    select id from t where num=0

    3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。

    4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

    select id from t where num=10 or num=20

    可以这样查询:

    select id from t where num=10

    union all

    select id from t where num=20

    5.in 和 not in 也要慎用,否则会导致全表扫描,如:

    select id from t where num in(1,2,3)

    对于连续的数值,能用 between 就不要用 in 了:

    select id from t where num between 1 and 3

    6.下面的查询也将导致全表扫描:

    select id from t where name like '%abc%'

    7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

    select id from t where num/2=100

    应改为:

    select id from t where num=100*2

    8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

    select id from t where substring(name,1,3)='abc'--name以abc开头的id

    应改为:

    select id from t where name like 'abc%'

    9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

    10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,

    否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

    11.不要写一些没有意义的查询,如需要生成一个空表结构:

    select col1,col2 into #t from t where 1=0

    这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:

    create table #t(...)

    12.很多时候用 exists 代替 in 是一个好的选择:

    select num from a where num in(select num from b)

    用下面的语句替换:

    select num from a where exists(select 1 from b where num=a.num)

    13.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

    14.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update有时可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

    15.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

    16.尽可能的使用 varchar 代替 char ,因为首先可变长度字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

    17.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

     

    展开全文
  • MS SQL Server数据库原理

    千次阅读 2019-01-23 11:24:09
    MS SQL Server数据库原理 一、 数据库基本概念 数据库系统(DBS):采用数据库技术的计算机系统,由数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、硬件平台(硬件)和软件平台(软件)五部分构成...
  • SQL索引工作原理

    千次阅读 2019-04-26 22:17:06
    SQL 当一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K用完的时候, SQLS指针会自动分配一个8K的空间。这里,每个8K空间被称为...
  • 文章目录@[toc]Web安全原理剖析一、SQL注入的基础1.1 介绍SQL注入1.2 注入的原理1.3 与MySQL注入相关的知识 Web安全原理剖析 一、SQL注入的基础 1.1 介绍SQL注入   SQL注入就是指Web应用程序对用户输入数据的...
  • SQL注入教程——(一)SQL注入原理

    千次阅读 2017-07-23 23:04:15
    前置技能 了解SQL语言、语法、操作、常用函数 (基本的SQL数据库操作是进行SQL...本文以假设存在的www.test.com/index.php 注入页面为例1.什么是SQL注入所谓SQL注入,就是通过把SQL命令插入到 Web表单提交 或 URL 或
  • 数据库原理实验一 SQL语言 实验报告

    千次阅读 多人点赞 2020-05-07 23:23:10
    数据库原理实验之实验一:SQL语言 软件:Oracle SQL Developer 实验今天刚开始,然后花了几个小时做完了,花费时间多说明之前学的SQL语句记忆还不劳,还得继续苦练啊! 一、数据库的创建与删除 1) 使用Oracle SQL ...
  • Sql 注入基础原理+实验

    千次阅读 2018-05-16 11:31:53
    Sql 注入基础原理介绍 一、实验说明 1.1 实验内容 SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,本章课程通过 LAMP ...
  • sql注入基础原理(超详细)

    万次阅读 多人点赞 2019-05-17 17:14:06
    一、Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。 二、Web 程序三层架构 三层...
  • SqlServer聚集索引原理

    千次阅读 2019-03-24 17:05:35
    测试所用数据库:SQLSERVER2012 我们都知道索引能提高查询速度,那么索引到底是怎么提高查询速度的呢?这要从索引的数据结构说起 索引分为聚集索引和非聚集索引,这两种索引的数据结构都是B+树,这篇文章主要讲解...
  • SQL注入原理与解决方法

    万次阅读 2016-08-04 21:27:13
    一、什么是sql注入? 1、什么是sql注入呢?  所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码...
  • hive sql语句执行原理

    千次阅读 2017-06-29 14:58:08
    大致理解为:hive会对写好的sql语句进行拆解,按执行顺序拆分成树结构(AST)交给mapreduce处理 hive对不同DML/DDL关键字有不同的反应,比较敏感的有select、from、join、group by、distinct、insert等 对查询语句,...
  • Mysql索引原理SQL优化

    千次阅读 多人点赞 2018-08-28 19:53:26
    二、索引的原理 为表设置索引要付出代价的: 一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。 上图展示了一种可能的索引方式。左边是数据表,一共有两列七条...
  • SQL注入原理及产生过程

    千次阅读 2018-06-27 14:09:20
    因为刚开始学习,涉猎还没有很深入,本章将简单的讲讲关于SQL注入的原理及其产生的过程和基本的一些加固方法。1.理解SQL注入SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数...
  • Sql Server 视图原理

    千次阅读 2014-01-24 15:24:56
    视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata.  视图简单的理解如下:    ...
  • SQL Server数据库原理实验报告(完)

    万次阅读 多人点赞 2019-04-18 11:34:04
    实验内容 实验一 熟悉数据库管理系统环境 实验二 SQL定义语言 实验三 使用SQL语言进行简单查询 ...2、 掌握SQL Server环境下SQL定义语言的用法,能进行基本表的结构的定义、修改、删除,会建立与删除索引。...
  • 数据库错误:Parameter index out of range (1 > number of parameters, which is 0). 错误发生原因其实很简单,就是当设置参数时,没有相应的问号与之匹配(或者根本就没有?号). 如果是:Parameter index out ...
  • SQL中索引的原理

    万次阅读 2009-01-13 10:24:00
    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别: ...
  • 简述一下动态sql的执行原理? 1.动态SQL的概念 ​ 动态sql是指在进行sql操作的时候,传入的参数对象或者参数值,根据匹配的条件,有可能需要动态的去判断是否为空,循环,拼接等情况; 2.动态Sql的标签大致有以下几...
  • SQL 索引最左前缀原理

    万次阅读 2016-05-06 13:42:51
    表结构和索引列假设数据库中表是这样的: ...索引是(emp_no,title,from_date)SHOW INDEX FROM employees.titles; +--------+------------+----------+--------------+-------------+-----------+-------------+---
  • sql 注入原理与方法篇

    千次阅读 2009-04-03 18:00:00
    SQL注入简介 许多网站程序在编写时,没有对用户输入数据的合法性进行判断, 使应用程序存在安全隐患。用户可以提交一段数据库查询代码, (一般是在浏览器地址栏进行,通过正常的www端口访问) 根据程序返回的结果,...
  • oracle统计sql优化与原理详解

    千次阅读 2018-06-26 14:41:06
    简介:oracle统计类sql的优化,此篇只讲count sum avg max min orderby,主要还是要知道索引存储列值和rowid的特性,我的博客里也有常用索引(树状索引)的详解。一.count(*)的优化直接上例子(假设test表有10w数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,901
精华内容 33,960
关键字:

index原理sql