这有两个关键点:
1、mysql是索引组织表,所有行数据以及非主键索引的索引都是挂接在主键索引上,如果是对主键进行查询(此时mysql优化器基本上忽略使用SQL条件中包含的其他索引)那么效率非常高,并且索引组织表的特色的Coverage index scan扫描索引即可返回数据,使得查询速度相当快。 但如果查询不包含主键条件那么性能就急剧下降——mysql会先根据条件索引找到主键索引定位再去找数据。这也是mysql非主键索引性能低下的原因。
mysql 4.x不支持子查询,即便新版5支持子查询也存在问题(SQL标准上以及性能上)。所以DZ肯定要屏蔽的。
对于屏蔽UNION另外一个重要原因是防止SQL注入——应用层对于敏感字符的处理不可靠(尤其是插件带入的),并且db类也没采用mysql_real_escape()来脱敏或者用prepare/execute来彻底封堵。光用addslashes()不安全,对于用双字节字符构造注入的方式存在防范漏洞。
大部分情况JOIN连接比子查询效率高。但有时候是相反的,比如在个大表中查询取多字段数据,如果直接ORDER BY那么资源消耗多,效率也低。这时候可以先在个子查询里面做ORDER BY以及分页计算然后返回PK值,外层用
SELECT * FROM WHERE pk IN (subquery) ORDER BY the same, 可以有相当提升。