手机版

MySQL数据库的SQL层次优化

时间:2021-08-01 来源:互联网 编辑:宝哥软件园 浏览:

类型:数据库类大小:5.3M语言:中文评分:5.0标签:说明下载SQL立即详细说明SQL语句的每个部分是如何以及何时以图形或基于文本的方式执行的。这包括以下基本信息:

正在访问的表

正在使用的索引

何时连接数据

何时对数据进行排序

“解释”还捕获更复杂的信息,这在深入研究SQL中发生的事情时非常有用:

表和索引基数

连接表和索引的顺序

结果集的基数

查询的每个部分都选择了哪些字段

分类方法

SQL各部分的时间范围

1.一次插入多个语句

避免圆形单插,很贵!在IBATIS中一次插入多条语句进行配置:

insert id=' insertUserList ' parameter class=' Java . util . list '

![CDATA[

插入用户(

id,

用户名,

密码

)值

]]]]

迭代连接=','

![CDATA[

#list[]。id#,

#list[]。用户名#,

#list[]。passWord#

)

]]]]

/iterate

/insert

2.有效使用索引

-索引唯一列.在MySQL中使用唯一索引会提高效率,只需要为了搜索的目的设置即可。

-在WHERE条件下尽可能多地使用索引。

——工会指数被考虑,但存在“首当其冲”的问题。

-forceindex强制使用指定的索引列表,SELECT SQL_BUFFER_RESULTS强制MySQL生成临时结果集(制作一个好的临时结果集会大大提高性能,并且SQL_SMALL_RESULT和SQL_BIG_RESULT),USE INDEX给出引用索引列表,IGNORE INDEX给出被忽略的索引列表。

-避免在索引列中使用“为空”或“不为空”。

3.请务必使用LIMIT 1

大型数据集将占用内存和带宽等资源。使用LIMIT强制分页并减少服务器压力。

4.无论是在WHERE查询还是表字段设计中使用默认值,都要尽可能使用NOT NULL。

5、用并集代替或

至少在MySQL中,当在or-情况下使用索引时,索引会失去速度优势。尽管正在应用索引,但是这并没有用。

从事件中选择*用户A位置A . `用户ID`=39235750或A . `用户移动电话`='18961751810 '

和.相对

(从事件中选择*用户,其中‘用户标识’=39235750)

联盟

(从事件中选择*用户所在位置`用户移动电话`='18961751810 ')

第一个是index_merge,第二个是ref(const)。Refs优于index_merge。虽然此语句中OR的性能可能略高于UNION(约1ms),但UNION可以保证必须取索引,MySQL的OR执行计划不取index_merge的概率相当高。“或”的每个条件列都必须使用索引,“或”只使用索引。

6.使用适当的数据类型并减少存储空间

-使用ENUM而不是VARCHAR。ENUM使用TINYINT,紧凑快速,但可以拥有字符串的“华丽外观”。如果是预定义类型,可以尝试SET类型。ENUM添加了一个新类型。使用PROCEDURE ANALYSE分析表中的枚举建议。

-使用DATE和时间戳来避免DATETIME。TIMESTAMP的内存空间是DATETIME的一半。

7.避免不必要的排序,如DISTINCT,这会触发排序

-按组或按空.默认情况下,GROUP BY使用排序,因此如果结果集很大,可以通过ORDER BY NULL移除它。

-orderby,只有WHERE中同一复合索引中的键处于统一的ASC/DESC模式

示例:选择*从零件_键1顺序到零件_键1描述,零件_键2描述

8.小心不要使用,避免使用IN、NOT IN、OR或HAVING等。

使用EXIST和NOT EXISTS,而不是in和NOT EXISTS,因为可以在关联子句中直接转到WHERE。可以用""代替。例如:

从“会员卡”中选择会员卡,其中会员卡编号为1247

和.相对

从“MC_MemberCard”中选择MemberCard,其中member card 1247或member card 1247

更快的1毫秒

9、通配符,如“a%”,而不是“a%”

“%”是前缀匹配和索引,但“A%”会导致全表查询。

10.不要以字符的形式声明数字

A=1,而不是a='1' 1,因为它会使索引无效并导致全表扫描。会吗?

11.禁用选择更新

FOR UPDATE属于悲观锁定,在整个数据处理过程中都会被锁定。乐观锁定采用更宽松的锁定机制。维基的定义如下:

乐观并发控制(OCC)是一种用于关系数据库管理系统的通用控制方法,它假设多个事务可以在不影响彼此的情况下完成,因此事务可以在不锁定它们影响的数据资源的情况下进行。在提交之前,每个事务都验证没有其他事务修改过它的数据。如果检查发现修改冲突,提交事务将回滚。

乐观锁定最常见的方式是使用版本或时间戳来防止数据不一致。修改数据时,可以使用行写锁来确保唯一性:

更新测试集版本1=版本,其中标识=xxx

Hibernate支持框架中的乐观锁定机制,而IBATIS暂时没有相应的支持,但请参考以下内容:

http://atejtymes . blogspot . hk/2010/11/乐观-锁定-on-ibatis.html

您也可以使用先决条件来解决并发问题,例如:

更新状态='购买_SUCC '其中订单编号=xxx,状态='等待_付款'

12、垂直分割

水平分区和SQL处理起来太复杂,但经验表明,一般场景下效率提升不大,查询频繁、表长固定的部分可以作为一部分。我应该什么时候做?

13.对于高并发写操作的表,不建议使用自增ID

使用自加ID会造成写锁保护,MySQL的UUID()无法使用,因为会导致主备数据不一致。ID在并发应用程序中生成,以确保唯一性。建议使用两种方法:

-经典组合guid/时间戳模式:32字节,太慢了。使用BitConverter。ToInt64()转换成8字节,可以接受,友好;

-根据业务规则定制方案。如:12位年、月、日、时、分、秒,3位服务器代码,3位表代码,5位随机代码/管道代码。什么水平的自我提升会阻碍阅读和写作?

14.使用准备好的报表(JDBC)

二是SQL解析和执行计划生成次数少,顺便过滤注入。在IBATIS中,# id { 0 }表示PreparedStatement参数,在XML语句准备中,有statementType参数,默认为PREPARED。

版权声明:MySQL数据库的SQL层次优化是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐