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 /sandboxes/msb_5_6_51/tmp/

total 808 jt

-rw - rw-- -- 1 przemek przemek 329M Sep 29 23. 24 '#sql_11765a_0. MYD'

-rw - rw-- -- 1 przemek przemek 479M Sep 29 23. 24 '#sql_11765a_0. MYI'

Mungkin sulit untuk mengkorelasikan tabel temp tertentu dan koneksi kliennya. Satu-satunya informasi yang saya temukan adalah

MySQL

1

2

3

4

5

6

7

8

9

10

11

mysql > pilih FILE_NAME,EVENT_NAME dari performance_schema.file_summary_by_instance di mana nama_file seperti '%tmp%'<<<<<<<<<<<<<<<<<<<<<< \G

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

FILE_NAME. /data / kotak pasir /msb_5_6_51/tmp/Innodb Merge Temp File

EVENT_NAME. tunggu / io /berkas/innodb/innodb_temp_file

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

FILE_NAME. /data / kotak pasir / . MYI /tmp/#sql_11765a_0.MYI

EVENT_NAME. tunggu / io /berkas/myisam/kfile

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

FILE_NAME. /data / kotak pasir / . MYD /tmp/#sql_11765a_0.MYD

EVENT_NAME. tunggu / io /berkas/myisam/dfile

3 baris dalam set (0. 00 dtk)

MySQL5. 7

Tabel Sementara Buatan Pengguna

Seperti sebelumnya, variabel default_tmp_storage_engine menentukan mesin yang digunakan. Tetapi dua perubahan terjadi di sini. Tabel sementara InnoDB sekarang menggunakan tablespace bersama khusus yang umum – ibtmp1, kecuali jika dikompresi. Selain itu, kami memiliki tampilan information_schema tambahan. INNODB_TEMP_TABLE_INFO. Mengingat itu, kita bisa mendapatkan informasi seperti di bawah ini

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

mysql > pilih nama, FILE_NAME, FILE_TYPE, TABLESPACE_NAME, SPACE, PER_TABLE_TABLESPACE, IS_COMPRESSED from INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO gabung INFORMATION_SCHEMA. FILE pada FILE_ID =SPASI\G

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

nama. #sql12cf58_2_5

FILE_NAME. . /ibtmp1

FILE_TYPE. SEMENTARA

TABLESPACE_NAME. innodb_temporary

SPASI . 109

PER_TABLE_TABLESPACE. SALAH

IS_COMPRESSED. SALAH

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

nama. #sql12cf58_2_4

FILE_NAME. /data / kotak pasir / . ibd /tmp/#sql12cf58_2_4.ibd

FILE_TYPE. SEMENTARA

TABLESPACE_NAME. innodb_file_per_table_110

SPASI . 110

PER_TABLE_TABLESPACE. BENAR

IS_COMPRESSED. BENAR

2 baris di set (0. 01 dtk)

Tetapi sekali lagi untuk berkorelasi dengan nama tabel, Percona Server untuk ekstensi MySQL perlu digunakan

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

mysql > pilih g. TABLE_SCHEMA, g. TABLE_NAME, nama, FILE_NAME, FILE_TYPE, TABLESPACE_NAME, SPACE, PER_TABLE_TABLESPACE, IS_COMPRESSED from INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO gabung INFORMATION_SCHEMA. FILE pada FILE_ID =SPACE . GLOBAL_TEMPORARY_TABLES information_schema.GLOBAL_TEMPORARY_TABLES g menggunakan (nama)\G

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

TABLE_SCHEMA. tes

TABLE_NAME. tmp1

nama. #sql12cf58_2_5

FILE_NAME. . /ibtmp1

FILE_TYPE. SEMENTARA

TABLESPACE_NAME. innodb_temporary

SPASI . 109

PER_TABLE_TABLESPACE. SALAH

IS_COMPRESSED. SALAH

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

TABLE_SCHEMA. tes

TABLE_NAME. tmp3

nama. #sql12cf58_2_4

FILE_NAME. /data / kotak pasir / . ibd /tmp/#sql12cf58_2_4.ibd

FILE_TYPE. SEMENTARA

TABLESPACE_NAME. innodb_file_per_table_110

SPASI . 110

PER_TABLE_TABLESPACE. BENAR

IS_COMPRESSED. BENAR

2 baris di set (0. 01 dtk)

Atau, untuk melihat juga MyISAM dan yang terkait. file frm, kita dapat menggunakan

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

mysql > PILIH g. TABLE_SCHEMA, g. TABLE_NAME, NAME, f. FILE_NAME, g. ENGINE , TABLESPACE_NAME, PER_TABLE_TABLESPACE, SPACE FROM information_schema.GLOBAL_TEMPORARY_TABLES g gabung skema_kinerja. file_instances f AKTIF NAMA_FILE SEPERTI . nama,('%', g.name, '%' ) kiri bergabung INFORMATION_SCHEMA. INNODB_TEMP_TABLE_INFO menggunakan (nama) gabung kiri INFORMATION_SCHEMA. FILE fl pada ruang=FILE_ID order by table_name\G

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

TABLE_SCHEMA. tes

TABLE_NAME. tmp1

NAMA. #sql12cf58_2_5

FILE_NAME. /data / kotak pasir / . dari /tmp/#sql12cf58_2_5.frm

MESIN . InnoDB

TABLESPACE_NAME. innodb_temporary

PER_TABLE_TABLESPACE. SALAH

SPASI . 109

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

TABLE_SCHEMA. tes

TABLE_NAME. tmp2

NAMA. #sql12cf58_2_6

FILE_NAME. /data / kotak pasir / . MYD /tmp/#sql12cf58_2_6.MYD

MESIN . MyISAM

TABLESPACE_NAME. NULL

PER_TABLE_TABLESPACE. NULL

SPASI . NULL

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

TABLE_SCHEMA. tes

TABLE_NAME. tmp2

NAMA. #sql12cf58_2_6

FILE_NAME. /data / kotak pasir / . MYI /tmp/#sql12cf58_2_6.MYI

MESIN . MyISAM

TABLESPACE_NAME. NULL

PER_TABLE_TABLESPACE. NULL

SPASI . NULL

*************************** 4. baris ***************************

TABLE_SCHEMA. tes

TABLE_NAME. tmp2

NAMA. #sql12cf58_2_6

FILE_NAME. /data / kotak pasir / . dari /tmp/#sql12cf58_2_6.frm

MESIN . MyISAM

TABLESPACE_NAME. NULL

PER_TABLE_TABLESPACE. NULL

SPASI . NULL

*************************** 5. baris ***************************

TABLE_SCHEMA. tes

TABLE_NAME. tmp3

NAMA. #sql12cf58_2_4

FILE_NAME. /data / kotak pasir / . dari /tmp/#sql12cf58_2_4.frm

MESIN . InnoDB

TABLESPACE_NAME. innodb_file_per_table_110

PER_TABLE_TABLESPACE. BENAR

SPASI . 110

*************************** 6. baris ***************************

TABLE_SCHEMA. tes

TABLE_NAME. tmp3

NAMA. #sql12cf58_2_4

FILE_NAME. /data / kotak pasir / . ibd /tmp/#sql12cf58_2_4.ibd

MESIN . InnoDB

TABLESPACE_NAME. innodb_file_per_table_110

PER_TABLE_TABLESPACE. BENAR

SPASI . 110

6 baris dalam set (0. 01 dtk)

Tabel Sementara Internal

Untuk tabel sementara internal di 5. 7, mirip dalam hal memori. Tapi mesin default untuk tabel temp on-disk ditentukan melalui variabel baru. , yang sekarang defaultnya juga ke InnoDB, dan juga tablespace ibtmp1 digunakan untuk menyimpan isinya

Wawasan tentang tablespace sementara yang dibagikan ini sangat terbatas. Kami dapat memeriksa ukurannya dan berapa banyak ruang kosong yang tersedia saat ini. Tampilan contoh diambil selama kueri berat sedang berlangsung

MySQL

1

2

3

4

5

6

7

8

9

10

11

mysql > pilih FILE_NAME, FILE_TYPE, TABLESPACE_NAME, ENGINE, TOTAL_EXTENTS, FREE_EXTENTS, EXTENT_SIZE/1024/1024 as 'extent in MB', MAXIMUM_SIZE from INFORMATION_SCHEMA.FILES di mana nama_file suka '%ibtmp%' < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <\G

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

FILE_NAME. . /ibtmp1

FILE_TYPE. SEMENTARA

TABLESPACE_NAME. innodb_temporary

MESIN . InnoDB

TOTAL_EXTENTS. 588

FREE_EXTENTS. 1

seluas dalam MB. 1. 00000000

MAXIMUM_SIZE. NULL

1 baris dalam set (0. 00 dtk)

Dan setelah kueri selesai, kita dapat melihat sebagian besar ruang kosong (FREE_EXTENTS)

MySQL

1

2

3

4

5

6

7

8

9

10

11

mysql > pilih FILE_NAME, FILE_TYPE, TABLESPACE_NAME, ENGINE, TOTAL_EXTENTS, FREE_EXTENTS, EXTENT_SIZE/1024/1024 as 'extent in MB', MAXIMUM_SIZE from INFORMATION_SCHEMA.FILES di mana nama_file suka '%ibtmp%' < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <\G

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

FILE_NAME. . /ibtmp1

FILE_TYPE. SEMENTARA

TABLESPACE_NAME. innodb_temporary

MESIN . InnoDB

TOTAL_EXTENTS. 780

FREE_EXTENTS. 764

seluas dalam MB. 1. 00000000

MAXIMUM_SIZE. NULL

1 baris dalam set (0. 00 dtk)

Namun, tablespace tidak akan terpotong kecuali MySQL di-restart

Kerang

1

2

$ ls - lh msb_5_7_35/data/ibtmp*

- rw - r ----- . 1 przemek przemek 780M Sep 30 19:50 msb_5_7_35 / data / ibtmp1

Untuk melihat aktivitas penulisan (yang mungkin ternyata jauh lebih tinggi untuk satu kueri daripada pertumbuhan ukuran total yang dibuat olehnya)

MySQL

1

2

3

4

5

mysql > pilih FILE_NAME, SUM_NUMBER_OF_BYTES_WRITE /1024/1024/1024 as GB_written from performance_schema.file_summary_by_instance di mana nama_file seperti '%ibtmp%' \G

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

FILE_NAME. /data / kotak pasir /msb_5_7_35/data/ibtmp1

GB_ditulis. 46. 925933837891

1 baris dalam set (0. 00 dtk)

MySQL8. 0

Untuk kesederhanaan, mari lewati cara kerja sebelum 8. 0. 16 dan diskusikan hanya cara kerjanya sejak itu, karena perubahan dalam hal itu cukup signifikan

  • variabel telah dihapus dan tidak mungkin lagi menggunakan mesin MyISAM untuk tabel sementara internal
  • ruang tabel ibtmp1 bersama tidak lagi digunakan untuk jenis tabel sementara
  • kumpulan Tablespace Sementara Sesi baru diperkenalkan untuk menangani pengguna dan tabel sementara internal pada disk dan terletak secara default di direktori data utama
  • mesin TempTable baru untuk tabel dalam memori menggunakan ruang dalam memori serta file yang di-mmap pada disk

Tabel Sementara Buatan Pengguna

Sebagai contoh tabel sementara

MySQL

1

2

3

4

5

6

7

8

9

10

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

Kueri Oke, 0 baris terpengaruh (0.00 dtk)

 

mysql > pilih * dari information_schema.INNODB_TEMP_TABLE_INFO;

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

. TABLE_ID . NAMA           | N_COLS . RUANG       .

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

.     1089 . #sqlbbeb3_a_12. 5. 4243767289.

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

1 baris dalam set (0. 00 dtk)

Kami dapat mengkorelasikan file mana yang digunakan dari kumpulan itu dengan melihat nomor ruang

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

mysql > pilih * dari INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ;

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

. ID . RUANG       . PATH                       | UKURAN  . NEGARA    . TUJUAN   .

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

. 10 . 4243767290 . . / #innodb_temp/temp_10. ibt. 81920. AKTIF. HAKIKI.

. 10 . 4243767289 . . / #innodb_temp/temp_9. ibt. 98304. AKTIF. PENGGUNA.

. 0 . 4243767281 . . / #innodb_temp/temp_1. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

. 0 . 4243767282 . . / #innodb_temp/temp_2. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

. 0 . 4243767283 . . / #innodb_temp/temp_3. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

. 0 . 4243767284 . . / #innodb_temp/temp_4. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

. 0 . 4243767285 . . / #innodb_temp/temp_5. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

. 0 . 4243767286 . . / #innodb_temp/temp_6. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

. 0 . 4243767287 . . / #innodb_temp/temp_7. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

. 0 . 4243767288 . . / #innodb_temp/temp_8. ibt. 81920. TIDAK AKTIF. TIDAK ADA.

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

10 baris di set (0. 00 dtk)

Tapi sekali lagi, tidak ada cara untuk mencari nama tabelnya. Untungnya, Percona Server untuk MySQL masih memiliki tabelnya, jadi dengan tiga tampilan sistem yang tersedia, kita bisa mendapatkan informasi yang lebih baik tentang tabel sementara buatan pengguna menggunakan berbagai mesin, seperti di bawah ini

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

mysql > PILIH SESSION_ID, SPACE, PATH, TABLE_SCHEMA, TABLE_NAME, SIZE, DATA_LENGTH, INDEX_LENGTH, ENGINE, PURPOSE FROM information_schema.GLOBAL_TEMPORARY_TABLES GABUNG KIRI skema_informasi. INNODB_TEMP_TABLE_INFO MENGGUNAKAN (NAME) LEFT JOIN INFORMATION_SCHEMA. INNODB_SESSION_TEMP_TABLESPACES MENGGUNAKAN ( SPACE )\G

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

  SESSION_ID. 10

      RUANG . 4243767290

        PATH. . / #innodb_temp/temp_10. ibt

TABLE_SCHEMA. tes

  TABLE_NAME. tmp3

        UKURAN. 98304

DATA_LENGTH. 16384

INDEX_LENGTH. 0

      ENGINE . InnoDB

    TUJUAN. PENGGUNA

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

  SESSION_ID. 13

      RUANG . NULL

        PATH. NULL

TABLE_SCHEMA. tes

  TABLE_NAME. tmp41

        UKURAN. NULL

DATA_LENGTH. 24

INDEX_LENGTH. 1024

      ENGINE . MyISAM

    TUJUAN. NULL

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

  SESSION_ID. 13

      RUANG . NULL

        PATH. NULL

TABLE_SCHEMA. tes

  TABLE_NAME. tmp40

        UKURAN. NULL

DATA_LENGTH. 128256

INDEX_LENGTH. 0

      ENGINE . MEMORY

    TUJUAN. NULL

*************************** 4. baris ***************************

  SESSION_ID. 13

      RUANG . 4243767287

        PATH. . / #innodb_temp/temp_7. ibt

TABLE_SCHEMA. tes

  TABLE_NAME. tmp33

        UKURAN. 98304

DATA_LENGTH. 16384

INDEX_LENGTH. 0

      ENGINE . InnoDB

    TUJUAN. PENGGUNA

4 baris dalam set (0. 01 dtk)

Mirip dengan ibtmp1, tablespace ini tidak terpotong selain dari restart MySQL

Dari penjelasan di atas, kita dapat melihat bahwa koneksi pengguna 10 memiliki satu tabel sementara InnoDB terbuka, dan koneksi 13 memiliki tiga tabel sementara menggunakan tiga mesin berbeda

Tabel Sementara Internal

Saat kueri berat sedang berjalan di koneksi 10, kita bisa mendapatkan tampilan berikut

MySQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

mysql > tampilkan daftar proses \G

...

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

    Id. 10

  Pengguna . msandbox

  Host . localhost

    db. tes

Perintah. Kueri

  Waktu . 108

  Negara. mengonversi HEAP menjadi ondisk

  Info. PILIH pad, COUNT (*) FROM sbtest1 GROUP BY pad

 

mysql > pilih * dari performance_schema.memory_summary_global_by_event_name di mana EVENT_NAME suka '%temptable%'\G

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

          .       EVENT_NAME: memori/menggoda/ disk_fisik

          .     COUNT_ALLOC: 2

          .       COUNT_FREE: 0

  SUM_NUMBER_OF_BYTES_ALLOC. 1073741824

    SUM_NUMBER_OF_BYTES_FREE. 0

          .   LOW_COUNT_USED: 0

          . 2

          . HIGH_COUNT_USED: 2

    LOW_NUMBER_OF_BYTES_USED. 0

CURRENT_NUMBER_OF_BYTES_USED. 1073741824

  HIGH_NUMBER_OF_BYTES_USED. 1073741824

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

          .       EVENT_NAME: memori/menggoda/ physical_ram

          .     COUNT_ALLOC: 12

          .       COUNT_FREE: 1

  SUM_NUMBER_OF_BYTES_ALLOC. 1074790400

    SUM_NUMBER_OF_BYTES_FREE. 1048576

          .   LOW_COUNT_USED: 0

          . 11

          . HIGH_COUNT_USED: 11

    LOW_NUMBER_OF_BYTES_USED. 0

CURRENT_NUMBER_OF_BYTES_USED. 1073741824

  HIGH_NUMBER_OF_BYTES_USED. 1073741824

2 baris di set (0. 00 dtk)

 

mysql > pilih * dari INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES di mana berada = 10\G

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

     ID. 10

   SPACE . 4243767290

   PATH. . / #innodb_temp/temp_10. ibt

   UKURAN. 2399141888

  NEGARA. AKTIF

TUJUAN. INTRINSIK

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

     ID. 10

   SPACE . 4243767289

   PATH. . / #innodb_temp/temp_9. ibt

   UKURAN. 98304

  NEGARA. AKTIF

TUJUAN. PENGGUNA

2 baris di set (0. 00 dtk)

Dari atas, kita dapat melihat kueri membuat tabel sementara yang sangat besar, yang pertama melebihi variabel dan terus tumbuh dalam file yang di-mmapped (masih mesin TempTable), tetapi karena juga tercapai, tabel harus dikonversi ke InnoDB on-disk . Kumpulan yang sama dari tabel InnoDB sementara digunakan dalam kasus ini, tetapi kita dapat melihat informasi tujuan, tergantung apakah tabel tersebut eksternal (dibuat pengguna) atau internal

File yang di-mmap tidak terlihat di sistem file karena telah dihapus, tetapi dapat ditonton dengan lsof

Kerang

1

mysqld   862655 przemek   52u      REG              253,3  133644288  52764900 /data/sandboxes/msb_ps8_0_23/tmp/mysql_temptable.8YIGV8 (dihapus)

Penting untuk diketahui di sini, bahwa selama ruang yang di-mmap belum terlampaui, penghitung tidak bertambah meskipun file dibuat di disk di sini

Juga, di Percona Server untuk MySQL, log lambat yang diperluas, ukuran tabel sementara saat mesin TempTable digunakan, tidak diperhitungkan. https. // jira. percona. com/browse/PS-5168 – ini menunjukkan “Tmp_table_sizes. 0”

Dalam beberapa kasus penggunaan, ada masalah yang dilaporkan dengan TempTable. Dimungkinkan untuk beralih kembali ke mesin Memori lama melalui variabel jika diperlukan

Apakah MySQL mendukung tabel sementara?

Tabel sementara telah ditambahkan di MySQL Versi 3. 23 . Jika Anda menggunakan versi MySQL yang lebih lama dari 3. 23, Anda tidak dapat menggunakan tabel sementara, tetapi Anda dapat menggunakan Tabel Tumpukan. Seperti yang dinyatakan sebelumnya, tabel sementara hanya akan bertahan selama sesi masih hidup.

Bagaimana cara menggunakan tabel sementara dalam kueri MySQL?

Di MySQL, sintaks membuat tabel sementara sama dengan sintaks membuat pernyataan tabel normal kecuali kata kunci TEMPORARY. Mari kita lihat pernyataan berikut yang membuat tabel sementara. mysql> CREATE TEMPORARY TABLE table_name ( column_1, column_2,. , table_constraints .

Kapan menggunakan tabel sementara di MySQL?

Anda dapat menggunakan kembali hasil sementara ini beberapa kali dalam satu sesi dalam MySQL. Tabel Sementara diperlukan ketika mahal atau hampir tidak mungkin untuk meminta data yang memerlukan pernyataan SELECT tunggal untuk bekerja bersama dengan klausa JOIN .

Di mana tabel temp di MySQL?

Tabel sementara internal dapat ditahan di memori dan diproses oleh mesin penyimpanan MEMORY, atau disimpan di disk oleh mesin penyimpanan InnoDB atau MyISAM. If an internal temporary table is created as an in-memory table but becomes too large, MySQL automatically converts it to an on-disk table.