Rumah  >  Artikel  >  pangkalan data  >  Mengapa pembahagian HASH bermasalah apabila membahagikan jadual mengikut lajur datetime dalam MySQL?

Mengapa pembahagian HASH bermasalah apabila membahagikan jadual mengikut lajur datetime dalam MySQL?

Susan Sarandon
Susan Sarandonasal
2024-10-25 00:56:02178semak imbas

Why is HASH partitioning problematic when partitioning a table by a datetime column in MySQL?

Membahagikan Jadual mengikut Lajur Datetime

Dalam MySQL, membahagikan jadual mengikut lajur datetime membolehkan pengurusan data yang cekap dan pertanyaan yang dioptimumkan dengan memisahkan jadual kepada unit logik yang lebih kecil. Walau bagaimanapun, apabila cuba membahagikan jadual mengikut lajur masa tarikh menggunakan pembahagian HASH, Isu mungkin timbul dalam memilih data untuk hari tertentu.

Had Pembahagian HASH

Menggunakan pembahagian HASH pada lajur datetime boleh menjadi masalah kerana MySQL tidak boleh menggunakan pemangkasan partition. Ini bermakna pertanyaan yang menapis berdasarkan julat nilai masa tarikh mungkin tidak menggunakan partition yang ditentukan.

Pilihan Pembahagian Alternatif

Untuk mengatasi had ini, strategi pembahagian alternatif boleh bekerja:

  • Menambah Lajur Integer:

Simpan hasil TO_DAYS(DATE()) dalam lajur INTEGER tambahan. Ini membolehkan pemangkasan cekap pada lajur integer dan bukannya lajur datetime.

  • Pembahagian Julat:

Pecahkan jadual menggunakan pembahagian RANGE pada TO_DAYS (ftime) lajur. Ini mencipta sekatan berdasarkan julat hari, membenarkan pengambilan data yang tepat untuk hari tertentu.

Contoh

Pertimbangkan jadual sekatan RANGE berikut:

CREATE TABLE raw_log_2011_4 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  logid char(16) NOT NULL,
  tid char(16) NOT NULL,
  reporterip char(46) DEFAULT NULL,
  ftime datetime DEFAULT NULL,
  KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
  PARTITION BY RANGE( TO_DAYS(ftime) ) (
    PARTITION p20110401 VALUES LESS THAN (TO_DAYS('2011-04-02')),
    PARTITION p20110402 VALUES LESS THAN (TO_DAYS('2011-04-03')),
    ...
    PARTITION p20110429 VALUES LESS THAN (TO_DAYS('2011-04-30')),
    PARTITION future VALUES LESS THAN MAXVALUE
  );

Jadual ini akan mengandungi partition untuk setiap hari pada April 2011. Sekarang, pertanyaan:

SELECT * FROM raw_log_2011_4 WHERE ftime = '2011-04-03';

hanya akan menggunakan partition p20110403, menghasilkan pengambilan data yang cekap untuk hari tertentu.

Atas ialah kandungan terperinci Mengapa pembahagian HASH bermasalah apabila membahagikan jadual mengikut lajur datetime dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn