返回首页

mysql 临时表

144 2024-09-21 21:04 admin

一、mysql 临时表

在数据库管理中,MySQL是一个非常受欢迎的关系型数据库管理系统。随着数据量和需求的增长,使用临时表成为了一种常见的解决方案。MySQL临时表是在连接会话期间存在的表,它们对于存储临时数据、处理复杂查询以及优化查询性能非常有用。

何为MySQL临时表?

MySQL临时表是在连接会话期间临时创建的表。它们具有与普通表相同的结构,但不保存在数据库的物理文件中。临时表的数据仅对创建它们的连接会话可见,其他连接不可访问。一旦会话结束,临时表会被自动删除。

临时表的特点

MySQL临时表具有以下几个特点:

  • 临时表只在会话期间存在。当会话结束时,临时表会自动被删除,无需手动清除。
  • 临时表的数据仅对创建它们的连接会话可见,其他连接无法访问。
  • 临时表可以使用SQL语句进行操作,包括查询、插入、更新和删除。
  • 可以创建多个不同名称的临时表。
  • 临时表可以具有索引、约束和触发器,与普通表一样。

为什么使用MySQL临时表?

使用临时表有以下几个好处:

  • 存储临时数据:临时表允许我们在会话期间存储和处理临时数据。如果需要对大量数据进行多次操作,可以将数据存储在临时表中,而不必频繁查询原始表,从而提高查询性能。
  • 处理复杂查询:对于复杂的查询,我们可以使用临时表将查询过程分解为多个步骤。通过将查询结果存储在临时表中,我们可以逐步处理和优化查询,使查询更高效。
  • 优化查询性能:使用临时表可以帮助我们优化查询性能。例如,对于需要大量数据计算的查询,我们可以将中间结果存储在临时表中,避免重复计算,从而提高查询效率。
  • 简化复杂操作:临时表可以用于简化复杂的数据库操作。通过将多个简单操作组合成一系列临时表操作,我们可以更容易地实现复杂的业务逻辑。

创建和使用MySQL临时表

创建MySQL临时表非常简单。只需要在创建表的SQL语句中使用CREATE TEMPORARY TABLE关键字即可。下面是创建临时表的示例:

<!-- codeblock --> <p>CREATE TEMPORARY TABLE temp_table ( id INT, name VARCHAR(50) )</p>

注意,在创建临时表时不需要指定表名后面的数据库名。临时表默认创建在当前数据库中。

接下来,我们可以像操作普通表一样操作临时表,例如插入数据、查询数据、更新数据和删除数据。下面是一些常见的临时表操作示例:

<!-- codeblock -->
<p>-- 插入数据
INSERT INTO temp_table (id, name) VALUES (1, 'Alice');
</p>
<p>-- 查询数据
SELECT * FROM temp_table;
</p>
<p>-- 更新数据
UPDATE temp_table SET name = 'Bob' WHERE id = 1;
</p>
<p>-- 删除数据
DELETE FROM temp_table WHERE id = 1;
</p>

临时表的性能优化

在使用MySQL临时表时,我们可以采取一些措施来优化性能:

  • 仅存储必要数据:临时表只在会话期间存在,不需要永久保存数据。因此,我们应该仅存储必要的数据,避免存储大量不需要的数据,从而减少临时表的大小和查询时间。
  • 使用索引:如果临时表的数据量较大,可以考虑在临时表上创建索引。索引可以加快对临时表的查询操作,提高查询性能。
  • 定期清理临时表:尽管临时表会在会话结束时自动删除,但在数据量较大、查询频繁的情况下,会消耗一定的时间和资源。因此,建议根据实际需求定期清理临时表,释放资源。
  • 避免频繁创建临时表:频繁创建和删除临时表会引起额外的性能开销。如果可能的话,可以尝试重复使用同一个临时表,或者在一次会话中仅创建一个临时表。

总结

MySQL临时表是一种在连接会话期间存在的表,对存储临时数据、处理复杂查询以及优化查询性能非常有用。使用临时表可以简化复杂操作、提高查询效率,并且易于管理。

在使用临时表时,应根据实际需求合理创建、使用和清理临时表,以提高性能和优化资源利用。

二、mysql临时表

如何使用MySQL临时表提高数据库性能

在处理大规模数据或复杂查询时,数据库性能是至关重要的。MySQL作为广泛使用的关系型数据库管理系统,提供了很多优化技术来提高查询的效率。其中一种非常有用的技术就是使用MySQL临时表。

MySQL临时表是一种临时存储数据的机制,它只存在于当前会话中,并在会话结束时自动被删除。使用临时表可以有效地减轻数据库服务器的压力,提高查询的速度和性能。

创建MySQL临时表

要创建临时表,您可以使用CREATE TEMPORARY TABLE语句,后面跟上表的定义和列的数据类型。临时表的表名以#tmp_作为前缀,以便于区分。以下是一个创建临时表的示例:

CREATE TEMPORARY TABLE #temp_table ( id INT, name VARCHAR(50) );

上述语句创建了一个名为#temp_table的临时表,它包含了一个整数类型的id列和一个长度为50的字符串类型的name列。

使用MySQL临时表的优势

MySQL临时表的使用有许多优势:

  • 提高查询性能:临时表可以存储查询结果,避免多次执行复杂的查询,从而提高查询的速度。
  • 减少数据库服务器负载:通过将计算和过滤操作转移到临时表中进行,可以减轻数据库服务器的负载,提升整体性能。
  • 优化查询计划:临时表可以帮助优化查询计划,通过临时表的索引提高查询效率。
  • 方便数据操作:临时表允许进行临时性的数据操作,如排序、分组和连接等。这些操作可以在临时表上执行,而不影响原始表的数据。

使用MySQL临时表的案例

下面是一个使用临时表提高查询性能的案例:


-- 创建临时表
CREATE TEMPORARY TABLE #temp_orders (
    id INT,
    total_amount DECIMAL(10, 2)
);

-- 将查询结果存储到临时表中
INSERT INTO #temp_orders
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id;

-- 查询临时表
SELECT *
FROM customers
JOIN #temp_orders ON customers.id = #temp_orders.id;

上述示例中,我们首先创建了一个临时表#temp_orders,用于存储每个客户的订单总金额。然后,我们将查询结果插入到临时表中。最后,在查询中使用临时表与customers表进行连接。

通过使用临时表,我们可以避免在每次查询中重复计算订单总金额,提高查询的性能和效率。

注意事项

在使用MySQL临时表时,有一些注意事项需要注意:

  • 临时表只在当前会话中存在,会话结束后会自动被删除。如果您需要在多个会话中使用临时表,请确保在每个会话中重新创建。
  • 临时表的性能高度依赖于查询的优化和索引的使用。确保在临时表上创建适当的索引,以提高查询效率。
  • 不要滥用临时表。使用临时表应该是为了解决特定的性能问题,而不是作为常规操作。如果您发现频繁使用临时表,可能需要重新考虑数据库设计和查询优化。

结论

MySQL临时表是一种非常有用的优化技术,可以提高数据库的性能和查询效率。通过合理地使用临时表,您可以减轻数据库服务器的负载,缩短查询的响应时间,提升整体性能。

然而,在使用临时表时,需要注意合理使用,并结合查询优化和索引设计来提高性能。只有在特定的场景下,临时表才应该被使用。

希望本文对您理解和使用MySQL临时表有所帮助。祝您的数据库查询更加高效!

三、MySQL如何使用临时表?

先来说说临时表的概念。 临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种:

1全局临时表

这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。

2会话级别临时表

这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以 create temporary table 这样的关键词创建的表。

3事务级别临时表

这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。

4检索级别临时表

这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。

MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:

MySQL5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。

在MySQL5.7 中把临时表的相关检索信息保存在系统信息表中:information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看临时表的系统信息是没有太好的办法。

需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:

我现在用的OS是 Ubuntu12.X,想用tmpfs文件系统充当临时表空间,

root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'

lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/

然后把

innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

添加到my.cnf里的[mysqld]下面一行

重启MySQL服务后,

mysql>select @@innodb_temp_data_file_path\G

***************************1. row ***************************

@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

1 rowin set (0.00 sec)

先写一个批量创建临时表的存储过程:

DELIMITER$$

USE`t_girl`$$

DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

IN f_cnt INT UNSIGNED )

BEGIN

DECLARE i INT UNSIGNED DEFAULT 1;

WHILE i <= f_cnt

DO

SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');

PREPARE s1 FROM @stmt;

EXECUTE s1;

SET i = i + 1;

END WHILE;

DROP PREPARE s1;

END$$

DELIMITER;

现在来创建10张临时表:

mysql>call sp_create_temporary_table(10);

QueryOK, 0 rows affected (0.07 sec)

如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。

现在可以直接从数据字典里面检索相关数据。

mysql> select * frominformation_schema.innodb_temp_table_info;

+----------+--------------+--------+-------+----------------------+---------------+

|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

+----------+--------------+--------+-------+----------------------+---------------+

| 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |

| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

| 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |

| 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |

| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

| 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |

| 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |

| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

| 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |

| 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |

+----------+--------------+--------+-------+----------------------+---------------+

10rows in set (0.00 sec)

功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。

四、php建立临时表

PHP 是一种广泛应用于 Web 开发领域的脚本语言,它的灵活性和易用性让许多开发者喜爱使用。在 PHP 中,建立临时表是一项常见的操作,特别是在需要临时存储数据、进行计算或排序时。今天我们将探讨如何使用 PHP 来创建临时表,以及如何有效地管理这些临时表。

什么是临时表

临时表是在数据库中临时存储数据的一种方式,它们并不永久保存在数据库中,而是在会话结束后自动删除。临时表通常用于存储中间结果或临时数据,以便于后续处理或计算。

在 PHP 中建立临时表

要在 PHP 中建立临时表,我们首先需要连接到数据库。假设我们正在使用 MySQL 数据库,我们可以通过以下代码片段来建立一个简单的临时表:

<?php $conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "CREATE TEMPORARY TABLE temp_table ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL )"; if ($conn->query($sql) === TRUE) { echo "临时表创建成功!"; } else { echo "Error creating table: " . $conn->error; } $conn->close(); ?>

管理临时表

一旦我们成功创建了临时表,接下来就需要有效地管理这些临时表。我们可以使用以下方法来对临时表进行操作:

  • 插入数据: 可以使用 SQL 语句向临时表中插入数据,例如 INSERT INTO temp_table (name) VALUES ('John')
  • 查询数据: 可以使用 SELECT 语句查询临时表中的数据,例如 SELECT * FROM temp_table
  • 更新数据: 可以使用 UPDATE 语句更新临时表中的数据,例如 UPDATE temp_table SET name = 'Alice' WHERE id = 1
  • 删除数据: 可以使用 DELETE 语句删除临时表中的数据,例如 DELETE FROM temp_table WHERE id = 1

注意事项

在使用临时表时,有一些注意事项需要我们考虑:

  1. 临时表仅在当前会话中可见,会话结束后将自动删除。
  2. 在创建临时表时需要确保数据库连接有效。
  3. 避免在程序中频繁创建大量临时表,以免影响性能。

总的来说,使用 PHP 建立临时表是一种方便快捷的方式来临时存储数据,并且能够帮助我们更好地进行数据处理和计算。通过合理地管理临时表,我们可以提高程序的效率并减少资源的浪费。

五、mysql中临时表和全局临时表的区别?

临时表无法访问数据和表结构

全局临时表可以访问数据和表结构

六、解析Mysql临时表及特点?

先来说说临时表的概念。 临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种:

1全局临时表

这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。

2会话级别临时表

这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以 create temporary table 这样的关键词创建的表。

3事务级别临时表

这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。

4检索级别临时表

这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。

MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:

MySQL5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。

在MySQL5.7 中把临时表的相关检索信息保存在系统信息表中:information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看临时表的系统信息是没有太好的办法。

需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:

我现在用的OS是 Ubuntu12.X,想用tmpfs文件系统充当临时表空间,

root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'

lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/

然后把

innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

添加到my.cnf里的[mysqld]下面一行

重启MySQL服务后,

mysql>select @@innodb_temp_data_file_path\G

***************************1. row ***************************

@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

1 rowin set (0.00 sec)

先写一个批量创建临时表的存储过程:

DELIMITER$$

USE`t_girl`$$

DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

IN f_cnt INT UNSIGNED )

BEGIN

DECLARE i INT UNSIGNED DEFAULT 1;

WHILE i <= f_cnt

DO

SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');

PREPARE s1 FROM @stmt;

EXECUTE s1;

SET i = i + 1;

END WHILE;

DROP PREPARE s1;

END$$

DELIMITER;

现在来创建10张临时表:

mysql>call sp_create_temporary_table(10);

QueryOK, 0 rows affected (0.07 sec)

如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。

现在可以直接从数据字典里面检索相关数据。

mysql> select * frominformation_schema.innodb_temp_table_info;

+----------+--------------+--------+-------+----------------------+---------------+

|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

+----------+--------------+--------+-------+----------------------+---------------+

| 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |

| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

| 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |

| 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |

| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

| 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |

| 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |

| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

| 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |

| 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |

+----------+--------------+--------+-------+----------------------+---------------+

10rows in set (0.00 sec)

功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。

七、mysql有全局临时表吗?

先来说说临时表的概念。 临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种:

1全局临时表

这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。

2会话级别临时表

这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以 create temporary table 这样的关键词创建的表。

3事务级别临时表

这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。

4检索级别临时表

这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。

MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:

MySQL5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。

在MySQL5.7 中把临时表的相关检索信息保存在系统信息表中:information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看临时表的系统信息是没有太好的办法。

需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:

我现在用的OS是 Ubuntu12.X,想用tmpfs文件系统充当临时表空间,

root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'

lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/

然后把

innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

添加到my.cnf里的[mysqld]下面一行

重启MySQL服务后,

mysql>select @@innodb_temp_data_file_path\G

***************************1. row ***************************

@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

1 rowin set (0.00 sec)

先写一个批量创建临时表的存储过程:

DELIMITER$$

USE`t_girl`$$

DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

IN f_cnt INT UNSIGNED )

BEGIN

DECLARE i INT UNSIGNED DEFAULT 1;

WHILE i <= f_cnt

DO

SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');

PREPARE s1 FROM @stmt;

EXECUTE s1;

SET i = i + 1;

END WHILE;

DROP PREPARE s1;

END$$

DELIMITER;

现在来创建10张临时表:

mysql>call sp_create_temporary_table(10);

QueryOK, 0 rows affected (0.07 sec)

如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。

现在可以直接从数据字典里面检索相关数据。

mysql> select * frominformation_schema.innodb_temp_table_info;

+----------+--------------+--------+-------+----------------------+---------------+

|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

+----------+--------------+--------+-------+----------------------+---------------+

| 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |

| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

| 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |

| 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |

| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

| 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |

| 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |

| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

| 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |

| 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |

+----------+--------------+--------+-------+----------------------+---------------+

10rows in set (0.00 sec)

功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。

八、Mysql内存表和临时表的区别?

先来说说临时表的概念。 临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种:

1全局临时表

这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。

2会话级别临时表

这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以 create temporary table 这样的关键词创建的表。

3事务级别临时表

这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。

4检索级别临时表

这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。

MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:

MySQL5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。

在MySQL5.7 中把临时表的相关检索信息保存在系统信息表中:information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看临时表的系统信息是没有太好的办法。

需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:

我现在用的OS是 Ubuntu12.X,想用tmpfs文件系统充当临时表空间,

root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'

lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/

然后把

innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

添加到my.cnf里的[mysqld]下面一行

重启MySQL服务后,

mysql>select @@innodb_temp_data_file_path\G

***************************1. row ***************************

@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

1 rowin set (0.00 sec)

先写一个批量创建临时表的存储过程:

DELIMITER$$

USE`t_girl`$$

DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

IN f_cnt INT UNSIGNED )

BEGIN

DECLARE i INT UNSIGNED DEFAULT 1;

WHILE i <= f_cnt

DO

SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');

PREPARE s1 FROM @stmt;

EXECUTE s1;

SET i = i + 1;

END WHILE;

DROP PREPARE s1;

END$$

DELIMITER;

现在来创建10张临时表:

mysql>call sp_create_temporary_table(10);

QueryOK, 0 rows affected (0.07 sec)

如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。

现在可以直接从数据字典里面检索相关数据。

mysql> select * frominformation_schema.innodb_temp_table_info;

+----------+--------------+--------+-------+----------------------+---------------+

|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

+----------+--------------+--------+-------+----------------------+---------------+

| 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |

| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

| 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |

| 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |

| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

| 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |

| 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |

| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

| 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |

| 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |

+----------+--------------+--------+-------+----------------------+---------------+

10rows in set (0.00 sec)

功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。

九、PHP+MYSQL两表合并查询,详细比如?

select * from A,B where A.id=B.idA表和B表要有一定的关联,比如上面就是用A表的id和B表的id把他们关联在一起查询,所以AB两表的内容都能被查询出来

十、php 还是python 连接mysql?

这两种语言都可以用来连接mysql数据库

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
用户名: 验证码:点击我更换图片

网站地图 (共30个专题228859篇文章)

返回首页