SQL的select语句完整的执行顺序 (1) FROM (2) JOIN/OUTER … ON (3)WHERE (4)GROUP BY (5)WITH (6)HAVING (7)SELECT (8)DISTINCT/ORDER BY 每个步骤执行的时候都会产生一个虚表,该虚表被作用为下一个步骤的输入,只有最后一步生成的表才会返回给调用者
MySQL如何分区分表 分表可以通过三种方式:Mysql集群、自定义规则和merge存储引擎。 分区有四类: RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST 分区:类似于按RANGE 分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个 值来进行选择。 HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的 这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。 KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器 提供其自身的哈希函数。必须有一列或多列包含整数值。
如何对查询命令进行优化 a. 应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索。 b. 应尽量避免在 where 子句中对字段进行 null 值判断,避免使用!=或<>操作符,避免使用 or 连接条件,或在where子句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描 c. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无 法正确使用索引。 d. 使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为 条件时才能保证系统使用该索引,否则该索引将不会被使用。 e. 很多时候可考虑用 exists 代替 in。 f. 尽量使用数字型字段。 g. 尽可能的使用 varchar/nvarchar 代替 char/nchar。 h. 任何地方都不要使用 select fromt ,用具体的字段列表代替“”,不要返回用不到的任何字段。 i. 尽量使用表变量来代替临时表。 j. 避免频繁创建和删除临时表,以减少系统表资源的消耗。 k. 尽量避免使用游标,因为游标的效率较差。 l. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF。 m. 尽量避免大事务操作,提高系统并发能力。 n. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
SQL注入是如何产生的,如何预防 程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。产生Sql注入。下面是防止办法: a. 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。 b. 在PHP 配置文件中将Register_globals=off;设置为关闭状态 c. SQL语句书写的时候尽量不要省略小引号(tab 键上面那个)和单引号 d. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的 e. 对于常用的方法加以封装,避免直接暴漏SQL语句 f. 开启PHP 安全模式:Safe_mode=on; g. 打开magic_quotes_gpc来防止SQL注入 h. 控制错误信息:关闭错误提示信息,将错误信息写到系统日志。 i. 使用mysqli或pdo预处理
NoSQL和关系数据库的区别 a.SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、 哈希表或者其他方式。 b. 在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引 (index),触发器(trigger),存储过程(stored procedure)等。表结构可以在被定义之后更新,但是如果有 比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要 先定义表。 c.SQL中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。 而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直 接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。 d. SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。 NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范 化的数据存储方式存储数据。 e. SQL中不允许删除已经被使用的外部数据,而NoSQL中则没有这种强耦合的概念,可以随时删 除任何数据。 f. SQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成 功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而NoSQL中没有事务这 个概念,每一个数据集的操作都是原子级的。 g. 在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是 优于SQL的。
MySQL如何实现分页 select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数。
提取数据库中倒数10条数据 select top (10) * from table1 order by id desc