mysql知识点

来源:互联网 发布:淘宝有卖楼凤资源的吗 编辑:程序博客网 时间:2024/05/19 05:38
当同时含有where子句,group by 子句,having子句,以及聚合函数SUM,COUNT,MAX,AVG等时,执行顺序如下
执行where子句查找符合条件的数据,再使用group by 子句对数据进行分组,之后对group by 子句形成的组运行聚合函数计算
每一组的值,最后用having子句去掉不符合条件的组


having 子句中的每一个元素也必须出现在select列表中,有些数据库例外,如oracle
having 子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
having 子句限制的是组,而不是行 ,where子句中不能使用聚合函数,而having子句中可以


分解关联查询:
很多高性能的应用都会对关联查询进行分解,简单地,可以对每一个表进行一次单表查询,然后将结果在应用程序中进行关联。例如
mysql>select * from tag
-> join tag_post on tag_post.tag_id=tag.id
-> join post on tag_post.post_id =post_id
-> where tag.tag='mysql';
可以分解成下面这些查询来代替:
mysql>select * from tag where tag='mysql';
mysql>select * from tag_post where tag_id =1234;
mysql>select * from post where post.id in (123,456,567,9098,8904); 
到底为什么要这样做?乍一看,这样做并没有什么好处,原本一条查询,这里却变成多条查询,
返回的结果有一摸一样。事实上,用分解关联查询的方式重构查询有如下的优势:
1.让缓存的效率更高。许多应用程序可以方便地缓存单表查询对应的结果对象。例如,上面查询中的tag已经被缓存了,那么应用就可以跳过
第一个查询。再例如,应用中已经缓存了ID为123.567.9098等内容,那么第三个查询的in()中可以少几个id,另外,对MySQL查询缓存来说。
如果关联中的某个表发生了变化,那么就无法使用缓存了,而拆分后,如果某个表很少变化。那么基于该表的查询就可以重复利用查询缓存结果
2.将查询分解后,执行单个查询可以减少锁的竞争
3.在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展
4.可以减少多余记录的查询。在应用层做关联查询,意味着对于某条记录应用只需查询一次,
而在数据库中做关联查询,则可能需要重复地访问一部分数据。从这点看,这样的重构还可能会减少网络和内存的消耗


Mysql查询缓存
查询缓存的作用就是当查询接收到一个和之前同样的查询,服务器将会从查询缓存中检索结果,而不是再次分析和执行上次查询。
这样就大大提高了性能,节省时间
1.配置查询缓存
修改配置文件,修改mysqld下的query_cache_size和query_cache_type(如果没有则添加)。其中query_cache_size表示缓存大小,
而query_cache_type=2,表示开启
query_cache_size=10M
query_cache_type=2