123
返回列表 发新帖
楼主: Amygo

[原创] 分布式事务数据库 —-MySQL 数据库开发规范

[复制链接]
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
21#
 楼主| 发表于 2019-5-14 17:41 | 只看该作者
WHERE 子句字段类型发生隐式转换
WHERE 子句的表字段类型为整型,向其传值一个字符串格式的数值在高并发情况下会
偶尔诱发类型隐式转换;
WHERE 子句的表字段类型为字符串,向其传值一个整型的数值,会诱发类型隐式转换;
表与表关联操作的等值连接条件,常容易出现 2 张表的关联字段类型不同或者数值类型
不同值域范围,而诱发类型隐式转换。


使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
22#
 楼主| 发表于 2019-5-14 17:41 | 只看该作者
7.4 用 WHERE 子句替换 HAVING 子句
两种子句的区别:先执行 WHERE 子句,后执行 HAVING 子句;HAVING 子句一般同 GROUP
子句配合使用;WHERE 子句是对元数据的过滤,HAVING 子句是对数据结果集的过滤;
HAVING 子句往往依据某一列、多列或表达式计算出来的列值进行过滤,或新列值别名进
行筛选。
示例:


使用道具 举报

回复
论坛徽章:
2
现任管理团队成员
日期:2020-02-20 02:10:00版主1段
日期:2020-02-20 02:10:12
23#
 楼主| 发表于 2019-5-15 17:31 | 只看该作者
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。
这种情况下,分布式中间件会把该语句发送到指定的节点执行;若不带上分片字段,则
该语句将会在所有的节点执行。

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


使用道具 举报

回复
求职 : 数据分析/ETL
论坛徽章:
16
鲜花蛋
日期:2014-08-09 15:15:33秀才
日期:2019-11-14 15:05:06秀才
日期:2019-11-14 15:03:23秀才
日期:2019-11-14 14:53:19秀才
日期:2019-11-14 14:44:34秀才
日期:2019-11-14 14:31:30目光如炬
日期:2018-07-01 22:00:00目光如炬
日期:2018-04-02 17:00:02火眼金睛
日期:2017-11-30 22:00:00火眼金睛
日期:2017-11-01 17:00:02
24#
发表于 2019-6-13 11:11 | 只看该作者
这么好的帖子先顶一下吧,有没有类似的mysql设计规范呢

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表