高性能 MySql 阅读笔记

1.优化子查询包含in()的sql语句

user表  

CREATE TABLE `user` (
  `ID` int(11) NOT NULL,
  `NAME` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  mid_user表

CREATE TABLE `mid_user` (
  `id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  使用in时的查询语句

SELECT * FROM `user` WHERE ID in(SELECT user_id FROM mid_user)

  使用EXISTS改写sql语句

SELECT
	*
FROM
	`user`
WHERE
	EXISTS (
		SELECT
			mid_user.id
		FROM
			mid_user
		WHERE
			`user`.ID = mid_user.user_id
	)

  EXISTS 会对外表user进行循环查询匹配,它不在乎后面的内表子查询的返回值是什么,只在乎有没有存在返回值,存在返回值,则条件为真,该条数据匹配成功,加入查询结果集中;如果没有返回值,条件为假,丢弃该条数据。

COUNT()的作用

  是一个特殊的函数   有两种非常不同的作用  1  它可以统计某个列值的数量  2  也可以统计行数

在统计列值的时候要求列值是非空的

COUNT() 的另一个作用是统计结果集的函数   当MYSQL确认括号呢的表达式值不可能为空时   实际上就是在统计行数   最简单的就是当我们使用COUNT(*) 的时候   这种情况下通配符 * 并不会像我们猜想的那样扩展成所有的列   实际上  他会忽略所有的列而直接统计所有的行数

  我们发现一个最常见的错误就是,在括号内指定了一个列却希望统计结果集的行数   如果希望知道的是结果集行数   最好使用count(*)   这样写意义清晰   性能也会很好

猜你喜欢

转载自www.cnblogs.com/shijl/p/10839074.html