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
MySQL1
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?
MySQL1
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
MySQL1
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
MySQL1
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
MySQL1
mysql > PILIH pad, COUNT(*) FROM sbtest1 GROUP BY pad;
Dan kita bisa melihat file terkait terus bertambah
MySQL1
2
3
4
$ ls -lh /data / pilih FILE_NAME,EVENT_NAME dari performance_schema.file_summary_by_instance di mana nama_file seperti '%tmp%'