mysql中关于tmp_table_size的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中关于tmp_table_size的问题相关的知识,希望对你有一定的参考价值。

tmp_table_size已设置为2G 目前项目数据库做个备份也才1.33G,为什么tmp_table总是在硬盘里创建?理论上来说临时表不可能大于2G,请详细说明,刚接触mysql优化,没有头绪!谢谢
另外:网站运行速度并不慢,主要页面TTFB一般都在150ms左右,没有发现高于500ms的

我遇到过同样的问题,经过研究是php框架在读表之前查询了表字段,这个查询固定会在硬盘里创建一个临时表,与tmp_table_size大小无关。

经过研究,设置框架的debug模式为false,数据库调试模式为false,并生成表结构缓存文件,成功解决本问题,望采纳!
参考技术A 打开你的mysql文件文件,找到my.ini中
中间有个=9M

MySQL中order by中关于NULL值的排序问题

MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的。 如果我们想让NULL排在后面,让非NULL的行排在前面该怎么做呢?


MySQL数据库在设计的时候,如果字段允许NULL值,那么对该字段进行排序的时候需要注意那些值为NULL的行。


我们知道NULL的意思表示什么都不是,或者理解成“未知”也可以,它与任何值比较的结果都是false,


默认情况下,MySQL会认为NULL值比其他类型的数据小, 也就是说,在order by排序的时候,NULL是最小的,ASC正序排序的话,NULL值是在最前面的。 如果我们想让NULL排在后面,让非NULL的行排在前面该怎么做呢?


下面我们通过一个小例子,来说明这个情况。


首先,创建一个测试数据表 test_user,


mysql> create table test_user(

id int unsigned not null auto_increment,

username varchar(10) not null,

age int,

primary key (id))

engine=myisam default charset=utf8 ;

Query OK, 0 rows affected (0.14 sec)


填充6条数据,其中3条设置了age值,另外3条age值为NULL


mysql> insert into test_user values(1,‘user1‘,28),(2,‘user2‘,30);

Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0


mysql> insert into test_user(username) values(‘user3‘),(‘user4‘),(‘user5‘);

Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0


mysql> insert into test_user values(6,‘user6‘,23);

Query OK, 1 row affected (0.00 sec)


mysql> select * from test_user;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 1 | user1 | 28 |

| 2 | user2 | 30 |

| 3 | user3 | NULL |

| 4 | user4 | NULL |

| 5 | user5 | NULL |

| 6 | user6 | 23 |

+----+-----------+------+ 6 rows in set (0.00 sec)


我们按照age字段从小到大排序,我们看到NULL值是最小的,排在了最前面


mysql> select * from test_user order by age;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 3 | user3 | NULL | | 4 | user4 | NULL |

| 5 | user5 | NULL |

| 6 | user6 | 23 |

| 1 | user1 | 28 |

| 2 | user2 | 30 |

+----+-----------+------+ 6 rows in set (0.00 sec)


按照age字段从大到小排序,我们看到NULL值确实是最小的,排在了最后面


mysql> select * from test_user order by age desc;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 2 | user2 | 30 |

| 1 | user1 | 28 |

| 6 | user6 | 23 |

| 3 | user3 | NULL |

| 4 | user4 | NULL |

| 5 | user5 | NULL |

+----+-----------+------+ 6 rows in set (0.00 sec)


这里有个需要注意的事项,就是NULL值本身是无法排序的,也就是说一个NULL是无法和另外一个NULL比较的。 你可能已经发现了,那三个NULL值的行,不管正序还是倒序,顺序都是一致的,当然也可能不一致。


那如果在对age进行正序排序的时候,我们希望NULL值的记录在最后面显示,那该如何做呢?


1、重新生成一列,比如agenull,利用is null操作符,把NULL值的行变成1,非NULL值的行变成0,先对该字段排序,再对age排序


mysql> select *,age is null as agenull from test_user order by agenull,age; +----+-----------+------+---------+ | id | username | age | agenull | +----+-----------+------+---------+ | 6 | user6 | 23 | 0 | | 1 | user1 | 28 | 0 | | 2 | user2 | 30 | 0 | | 3 | user3 | NULL | 1 | | 4 | user4 | NULL | 1 | | 5 | user5 | NULL | 1 | +----+-----------+------+---------+ 6 rows in set (0.01 sec)


2、直接利用isnull函数对age列求值,跟第一种方法的道理是一样的


mysql> select * from test_user order by isnull(age),age; +----+-----------+------+ | id | username | age | +----+-----------+------+ | 6 | user6 | 23 | | 1 | user1 | 28 | | 2 | user2 | 30 | | 3 | user3 | NULL | | 4 | user4 | NULL | | 5 | user5 | NULL | +----+-----------+------+ 6 rows in set (0.00 sec)


3、还可以利用MySQL中的一个小技巧,在字段前面加上一个负号,也就是减号,ASC改成DESC ,DESC改成ASC


mysql> select * from test_user order by -age desc; +----+-----------+------+ | id | username | age | +----+-----------+------+ | 6 | user6 | 23 | | 1 | user1 | 28 | | 2 | user2 | 30 | | 3 | user3 | NULL | | 4 | user4 | NULL | | 5 | user5 | NULL | +----+-----------+------+ 6 rows in set (0.00 sec)


所以,在设计数据库的时候,如果某个字段要进行排序的话,最好不要为NULL。



































以上是关于mysql中关于tmp_table_size的问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql 参数调优(10)之 tmp_table_size 优化临时表

MySQL CPU暴增

tmp_table_size参数

在VS中关于MySQL的相关问题

mysql中关于关联索引的问题

MySQL中order by中关于NULL值的排序问题