常见MySQL错误用法有哪些?小白怎么学Web前端?无论是前端开发还是后台应用,都需要掌握数据库相关的知识,而MySQL是企业常用的数据库之一。对于一个Web前端小白来说,在完成HTML+CSS的基础学习后,他们还需要学习MySQL相关操作,下面列举几种比较常见的MySQL错误用法,希望大家能够引以为鉴。
1、隐式转换
SQL语句中查询变量和字段定义类型不匹配是另一个常见的错误。比如下面的语句:
mysql> explain extended SELECT *
> FROM my_balance b
> WHERE b.bpn = 14000000123
> AND b.isverified IS NULL ;
mysql> show warnings;
| Warning | 1739 | Cannot use ref access on index 'bpn' due to type or collation conversion on field 'bpn'
其中字段bpn的定义为varchar(20),MySQL的策略是将字符串转换为数字之后再比较。函数作用于表字段,索引失效。
上述情况可能是应用程序框架自动填入的参数,而不是程序员的原意。现在应用框架很多很繁杂,使用方便的同时也小心它可能给自己挖坑。
2、混合排序
MySQL不能利用索引进行混合排序,但在某些场景,还是有机会使用特殊方法提升性能的。
SELECT *
FROM my_order o
INNER JOIN my_appraise a ON a.orderid = o.id
ORDER BY a.is_reply ASC,
a.appraise_time DESC
LIMIT 0, 20
由于is_reply只有0和1两种状态,我们按照上面的方法重写后,执行时间从1.58秒降低到2毫秒。
SELECT *
FROM ((SELECT *
FROM my_order o
INNER JOIN my_appraise a
ON a.orderid = o.id
AND is_reply = 0
ORDER BY appraise_time DESC
LIMIT 0, 20)
UNION ALL
(SELECT *
FROM my_order o
INNER JOIN my_appraise a
ON a.orderid = o.id
AND is_reply = 1
ORDER BY appraise_time DESC
LIMIT 0, 20)) t
ORDER BY is_reply ASC,
appraisetime DESC
LIMIT 20;
3、EXISTS语句
MySQL对待EXISTS子句时,仍然采用嵌套子查询的执行方式。如下面的SQL语句:
SELECT *
FROM my_neighbor n
LEFT JOIN my_neighbor_apply sra
ON n.id = sra.neighbor_id
AND sra.user_id = 'xxx'
WHERE n.topic_status < 4
AND EXISTS(SELECT 1
FROM message_info m
WHERE n.id = m.neighbor_id
AND m.inuser = 'xxx')
AND n.topic_type <> 5
去掉exists更改为join,能够避免嵌套子查询,将执行时间从1.93秒降低为1毫秒。
SELECT *
FROM my_neighbor n
INNER JOIN message_info m
ON n.id = m.neighbor_id
AND m.inuser = 'xxx'
LEFT JOIN my_neighbor_apply sra
ON n.id = sra.neighbor_id
AND sra.user_id = 'xxx'
WHERE n.topic_status < 4
AND n.topic_type <> 5
注意:
1)数据库编译器产生执行计划,决定着SQL的实际执行方式。但是编译器只是尽力服务,所有数据库的编译器都不是尽善尽美的。
2)了解数据库编译器的特性,才能避规其短处,写出高性能的SQL语句。
3)程序员在设计数据模型以及编写SQL语句时,要把算法的思想或意识带进来。
4)编写复杂SQL语句要养成使用WITH语句的习惯,简洁且思路清晰的SQL语句也能减小数据库的负担。
如果你想了解更多MySQL数据库知识,或者你想快速成为合格的Web前端工程师,可以选择专业的学习,让你快速系统的学好技能!