Amygo
作者Amygo·2019-05-20 18:59
DBA·分布式事务数据库

分布式事务数据库 —-MySQL 数据库开发规范(第七节)

字数 2669阅读 1087评论 1赞 1

今天Amy继续为大家更新“WHERE条件子句"的内容~相信学完这章大家应该对分布式事务数据库的开发有了深入的认识。接下来我会为大家奉上更多实用的开源数据库和MySQL常用工具的干货分享。感兴趣的读者可以继续关注我哦。

WHERE 条件子句

7.1 WHERE 子句中的数据扫描不超过表总数据量的 30%
比如:WHERE primary_key <> 1 或者 primary_key not in(…),这样扫描表的数据往往会超过
30%。
WHERE status=1,其中 1 值非常少,主要是 0 值,比如一个表的记录删除用了一个状态位,
而删除的记录又比较少。
WHERE 子句中同一个表的不同的字段组合建议小于等于 5 组,否则建议业务逻辑拆分
或分表。
WHERE 子句禁止出现 NULL 值计算
WHERE 子句中不允许出现更不允许出现对 NULL 值的错误计算方式:Column1=NULL 和
(column1>NULL 或 Column1<NULL)。故应该在字段定义时设置约束为 NOT NULL。
7.2 WHERE 子句的表字段上禁止使用表达式或是函数
当 WHERE 子句的表字段上使用函数后,将会导致该字段无法使用上索引,一般都是建议
在字段的值域上加函数、计算或转换的表达式。例如:

WHERE 子句字段类型发生隐式转换
WHERE 子句的表字段类型为整型,向其传值一个字符串格式的数值在高并发情况下会
偶尔诱发类型隐式转换;
WHERE 子句的表字段类型为字符串,向其传值一个整型的数值,会诱发类型隐式转换;
表与表关联操作的等值连接条件,常容易出现 2 张表的关联字段类型不同或者数值类型
不同值域范围,而诱发类型隐式转换。

7.4 用 WHERE 子句替换 HAVING 子句
两种子句的区别:先执行 WHERE 子句,后执行 HAVING 子句;HAVING 子句一般同 GROUP
子句配合使用;WHERE 子句是对元数据的过滤,HAVING 子句是对数据结果集的过滤;
HAVING 子句往往依据某一列、多列或表达式计算出来的列值进行过滤,或新列值别名进
行筛选。
示例:

7.5 使用 LIKE 时,%不要放在首字符位置
WHERE 子句中出现%放在首字符位置,会导致字段无法使用上索引,故建议禁止出现。
如果%必须放在首字符位置,执行频率极低的话,则建议直接使用 MySQL 存储引擎自身的
全文检索功能;若执行频率较高或高的话,则建议使用索引存储引擎 Sphinx 或 Lucene 实现。
7.6 WHERE 子句与函数
WHERE 子句中经常存在需要使用函数的情形,由于在数据列上使用函数将导致大量计算,
以及将导致无法使用索引,应当尽量避免在列上使用函数,转为在常量上运算,或其它方式
实现。
开发规范:
1> SELECT * FROM t1 WHERE data1+10>100;
该查询语句对列进行数学运算,可以化简运算到常量列进行。可以修改为查询语句:
“SELECT FROM t1 WHERE data1>100-10;” 2> SELECT FROM t1 WHERE date_add(data1,interval 1 day)>now();
该语句属于对列进行时间类型的函数运算。可以修改为查询语句:“SELECT FROM t1WHERE data1>date_sub(now(),interval 1 day);” 3> SELECT FROM t1 WHERE from_unixtime(data1)=‘2015-07-23 14:45:23’;
该语句属于对列进行时间类型的函数运算。可以修改为查询语句:“SELECT * FROM t1
WHERE data1=unix_timestamp(‘2015-07-23 14:45:23’);” 4> SELECT * FROM t1 WHERE year(data1)=2015;
该语句属于对列进行时间类型的函数运算。可以修改为查询语句:“SELECT * FROM t1
WHERE data1 between ‘2015-01-01 00:00:00’ and ‘2015-12-31 23:59:59’;”4.3.7 NULL 值计算
SELECT * FROM t1 WHERE ifnull(data1,0)=0;
如果字段定义是 not null 的,可以修改为查询语句“SELECT * FROM t1 WHERE data1=0;”。
如果字段定义允许空,并且应用混合使用 null 与 0 作业务角度的空值,建议推进将 0 作为
业务角度的空值,并修改字段定义为 not null,修改为查询语句“SELECT * FROM t1 WHERE
data1=0;”。如果无法推进修改,建议修改为查询语句“SELECT * FROM t1 WHERE (data1 is
null or data1=0);”。
SELECT * FROM t1 WHERE data1=null;
该 SQL 语句是错误的语句,原因为 MySQL 中 null 值与 null 值是不相等的,需要使用 is null
或者 null安全等于操作符“<=>”。需要修改语句为“SELECT FROM t1 WHERE data1 is null;” 或“SELECT FROM t1 WHERE data1<=>null;”。
7.8 WHERE 子句中同一字段的值 OR 可用 IN 替换
MySQL 数据库中 WHERE 子句的表字段 IN 条件,最终实现依然是转换成 OR 操作,为方便
大家程序阅读和放送 SQL 语句包大小综合因素,推荐大家可用 IN 取代同一字段的 OR 连接。

7.9 WHERE 子句尽量带分片字段
若 ID 为分片字段值,在进行 DML 操作的情况下,请尽量在 WHERE 语句中带上分片字段。
如:
UPDATE table_name set column1=? WHERE id=xxx And column2=xxx。
SELECT … FROM table_name WHERE id=xxx AND column2=xxx。
这种情况下,分布式中间件会把该语句发送到指定的节点执行;若不带上分片字段,则
该语句将会在所有的节点执行。

以上就是今天分享的内容~感谢观看!下一篇见!

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论1 条评论

wuwenpinwuwenpin软件开发工程师南京
2019-05-21 09:18
感谢分享!!
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广