Bisakah kita menggunakan tabel sementara di mysql?

Oleh karena itu, saya memutuskan untuk mengumpulkannya dalam semacam ringkasan yang dapat membantu memecahkan masalah penggunaannya. Karena perubahan besar antara rilis utama MySQL, saya membagi artikel berdasarkan mereka

MySQL5. 6

(Jika Anda masih menggunakan versi tersebut, Anda disarankan untuk mempertimbangkan untuk memutakhirkannya segera setelah mencapai EOL. )

Tabel Sementara Buatan Pengguna

Ketika sebuah tabel dibuat menggunakan klausa CREATE TEMPORARY TABLE, itu akan menggunakan mesin yang ditentukan oleh (default ke InnoDB) jika tidak secara eksplisit ditentukan sebaliknya dan akan disimpan di dalam direktori yang ditentukan oleh variabel

Contoh yang mungkin terlihat seperti ini

MySQL

1

2

3

4

5

6

7

8

9

10

11

mysql > buat tabel sementara tabel tmp1 (id int, a varchar(10));

Kueri Oke, 0 baris terpengaruh (0.02 dtk)

 

mysql > tampilkan buat tabel tmp1\G

*************************** 1. baris ***************************

Tabel . tmp1

Buat Tabel . BUAT SEMENTARA TABEL `tmp1` (

`id` int (11) DEFAULT NULL,

`a` varchar (10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 baris dalam set (0. 00 dtk)

Tapi bagaimana Anda menemukan file yang dibuat di disk yang menyimpan data tabel ini?

MySQL

1

2

3

4

5

6

7

mysql > pilih table_id, spasi,name,path from information_schema.INNODB_SYS_DATAFILES gabung information_schema. INNODB_SYS_TABLES menggunakan ( spasi ) where name like '%tmp%'\G

*************************** 1. baris ***************************

table_id. 21

spasi . 7

nama. tmp/ #sql11765a_2_1

jalan. /data / kotak pasir / . ibd /tmp/#sql11765a_2_1.ibd

1 baris dalam set (0. 00 dtk)

Kami tidak melihat nama tabel asli di sini. Bahkan dengan melihat buffer pool, kami masih belum mengetahui nama aslinya

MySQL

1

2

3

4

5

6

7

mysql > pilih TABLE_NAME dari information_schema.INNODB_BUFFER_PAGE di mana table_name seperti '%tmp%';

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

. TABLE_NAME                .

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

. `tmp`. ` #sql11765a_2_1`.

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

1 baris dalam set (0. 07 dtk)

Inilah ekstensi yang tersedia di Percona Server untuk MySQL 5. 6 varian – tabel information_schema tambahan. . Dengan itu, kami dapat membuat kueri yang memberikan lebih banyak informasi

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

mysql > pilih SPACE ,TABLE_SCHEMA,TABLE_NAME, . NAME,PATH ENGINE,g.NAME,PATH dari skema_informasi. GLOBAL_TEMPORARY_TABLES g GABUNG KIRI skema_informasi. INNODB_SYS_TABLES s AKTIF s. NAMA SEPERTI CONCAT ( '%', g.name, '%' ) LEFT JOIN information_schema. INNODB_SYS_DATAFILES MENGGUNAKAN ( SPACE )\G

*************************** 1. baris ***************************

SPASI . 16

TABLE_SCHEMA. tes

TABLE_NAME. tmp1

MESIN . InnoDB

NAMA. #sql12c75d_2_0

PATH. /data / kotak pasir / . ibd /tmp/#sql12c75d_2_0.ibd

*************************** 2. baris ***************************

SPASI . NULL

TABLE_SCHEMA. tes

TABLE_NAME. tmp3

MESIN . MEMORY

NAMA. #sql12c75d_2_2

PATH. NULL

*************************** 3. baris ***************************

SPASI . NULL

TABLE_SCHEMA. tes

TABLE_NAME. tmp2

MESIN . MyISAM

NAMA. #sql12c75d_2_1

PATH. NULL

3 baris dalam set (0. 00 dtk)

Jadi setidaknya untuk tabel temp InnoDB, kita dapat mengkorelasikan nama tabel yang tepat dengan jalur file

Tabel Sementara Internal

Ini adalah yang dibuat oleh MySQL dalam proses mengeksekusi kueri. Kami tidak memiliki akses apa pun ke tabel tersebut, tetapi mari kita lihat bagaimana kami dapat menyelidiki penggunaannya

Jenis ini dibuat di memori (menggunakan ) selama ukurannya tidak melebihi variabel tmp_table_size atau max_heap_table_size, dan jika tidak ada kolom TEXT/BLOB yang digunakan. Jika tabel seperti itu harus disimpan di disk, di MySQL 5. 6 itu akan menggunakan penyimpanan MyISAM dan juga tmpdir digunakan sebagai lokasi. Contoh cepat, pada tabel sysbench baris 10M, kueri menghasilkan tabel sementara internal yang besar

MySQL

1

mysql > PILIH pad, COUNT(*) FROM sbtest1 GROUP BY pad;

Dan kita bisa melihat file terkait terus bertambah

MySQL

1

2

3

4

$ ls -lh /data / pilih FILE_NAME,EVENT_NAME dari performance_schema.file_summary_by_instance di mana nama_file seperti '%tmp%'

Postingan terbaru

LIHAT SEMUA