最近发现了一个比较好的学习网站和工具下载网站,相当便宜,感兴趣的同学请移步:
昂炎数据(www.ayshuju.com)
count函数
count是一个聚合函数,首先理解一下count的含义:
count(*):查询出所有记录的条数
count(字段):查询出的所有记录中,不为null的条数
count(1):查询出的所有记录的条数
count(主键id):查询出的记录中主键不为null的条数
通过上面可以知道,count(*)和count(1)的效率最高,
count(*)和count(1):mysql的计算数据总和的方式是把所有数据条数逐一读入内存,做累加
count(字段)这样的方式,是把该字段读入内存,比对一下是否是null,然后再把数据条数累加
可以看出,count(字段)和count(主键)这种形式比count(*)和count(1)多了一种把该字段读入内存,然后计算是否为null的一步,所以效率要偏低。
还有一个问题,为什么每次都要计算一次数据条数呢,而不是直接在表数据中维护一个这样的数值呢。
这个又涉及到表的视图了,如果内部维护一个数值,会导致出现脏读等问题。
delete 语句
delete某条数据,或者drop table时,并不会真的把数据删掉,数据库会把该内存页或者记录标记为已删除的区域,这样该数据就进入了可以被覆盖的区域,所以,删除表数据,是不会起到减少数据库大小的作用的。
order by
全字段排序,当单行长度不超过设定值时,max_length_for_sort_data 这个是控制该设置的,使用全字段排序
如果排序的字段超过这个值,会使用rowid排序。
例如:select city ,age,name from table_name where city = '杭州' order by name limit 1000
这句话的全字段排序执行流程:
1、规划sort_buffer,不超过设置值,sort_buffer使用的字段就是city,age,name,id
2、根据city的索引找到city是杭州的所有id
3、根据id找到所有行
4、取city,age,name放入sort_buffer
5、把sort_buffer排序一下
6、取前1000条
rowid排序:
1、规划sort_buffer,超过了设置值,sort_buffer这个临时表只用id和name字段
...
...
...
7、再取sort_buffe的前1000条数据的id,再去原表中取出city,age,name,返回
流程的基本都一样,只不过sort_buffer的大小和最后一步不一样。
group by
当前读:
select * from table lock in share mode
当前读并且加写锁
select * from table for update