1. EXISTS 和 IN 的区分
问题:
不太理解哪种情况下应该使用 EXISTS,哪种情况应该用 IN。选择的标准是看能否使用表的索引吗?
回答:
索引是个前提,其实选择与否还是要看表的大小。可以将在的标准理解为小表驱动大表。
A表大 B表小,先把CC查出来给外面用,所以表小好SELECT * FROM A WHERE CC IN (SELECT CC FROM B);A表小 B表大,使用这个,减少嵌套循环次数SELECT * FROM A WHERE EXISTS (SELECT CC FROM B WHERE B.CC = A.CC);
2. COUNT(*)与COUNT(具体字段)效率
问:在 MySQL 中统计数据表的行数,可以使用三种方式: SELECT COUNT() 、 SELECT COUNT(1) 和 SELECT COUNT(具体字段) ,使用这三者之间的查询效率是怎样的?
SELECT COUNT() SELECT COUNT(1) 执行时间可能略有差别,可以把它俩的执行效率看成相等的。不同存储引擎中性能是有所差别的。
在InnoDB引擎中,如果采用COUNT(具体字段),尽量采用二级索引。因为聚簇索引包含的信息很多。 COUNT(1)COUNT() 会自动采用占用空间更小的二级索引来进行统计。
**3. 关于SELECT() *
在表查询中,建议明确字段,不要使用 作为查询的字段列表,推荐使用SELECT <字段列表> 查询。
原 因:
① MySQL 在解析的过程中,会通过查询数据字典 将”*”按序转换成所有列名,这会大大的耗费资源和时间。 ② 无法使用 覆盖索引 。
- LIMIT 1 对优化的影响
针对的是会扫描全表的 SQL 语句,如果你可以确定结果集只有一条,那么加上 LIMIT 1 的时候,当找 到一条结果的时候就不会继续扫描了,这样会加快查询速度。
如果数据表已经对字段建立了唯一索引,那么可以通过索引进行查询,不会全表扫描的话,就不需要加上 LIMIT 1 了。
多使用COMMIT
只要有可能,在程序中尽量多使用 COMMIT,这样程序的性能得到提高,需求也会因为 COMMIT 所释放 的资源而减少。
COMMIT 所释放的资源:
回滚段上用于恢复数据的信息
被程序语句获得的锁
redo / undo log buffer 中的空间
管理上述 3 种资源中的内部花费
