|
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。
这种情况下,分布式中间件会把该语句发送到指定的节点执行;若不带上分片字段,则
该语句将会在所有的节点执行。
以上就是今天分享的内容~感谢观看!
|
|