Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menyimpan data deret waktu secara efisien:mySQL atau file datar? Banyak tabel (atau file) atau query dengan kondisi WHERE?

Untuk menjawab pertanyaan ini, pertama-tama kita harus menganalisis yang nyata masalah yang Anda hadapi.

Masalah sebenarnya adalah kombinasi penulisan dan pengambilan data yang paling efisien.

Mari kita tinjau kesimpulan Anda:

  • ribuan tabel - baik, itu melanggar tujuan basis data dan membuatnya lebih sulit untuk dikerjakan. Anda juga tidak mendapatkan apa-apa. Masih ada pencarian disk yang terlibat, kali ini dengan banyak deskriptor file yang digunakan. Anda juga harus tahu nama tabelnya, dan jumlahnya ribuan. Juga sulit untuk mengekstrak data, untuk itulah database - untuk menyusun data sedemikian rupa sehingga Anda dapat dengan mudah melakukan referensi silang pada catatan. Ribuan tabel - tidak efisien dari perf. sudut pandang. Tidak efisien dari sudut pandang penggunaan. Pilihan yang buruk.

  • file csv - mungkin sangat baik untuk mengambil data, jika Anda membutuhkan seluruh konten sekaligus. Tapi itu jauh dari baik untuk memanipulasi atau mengubah data. Mengingat fakta bahwa Anda mengandalkan tata letak tertentu - Anda harus ekstra hati-hati saat menulis ke CSV. Jika ini berkembang menjadi ribuan file CSV, Anda tidak membantu diri sendiri. Anda menghapus semua overhead SQL (yang tidak terlalu besar) tetapi Anda tidak melakukan apa pun untuk mengambil bagian dari kumpulan data. Anda juga memiliki masalah dalam mengambil data historis atau referensi silang apa pun. Pilihan yang buruk.

Skenario yang ideal adalah dapat mengakses bagian mana pun dari kumpulan data dengan cara yang efisien dan cepat tanpa perubahan struktur apa pun.

Dan inilah alasan mengapa kami menggunakan database relasional dan mengapa kami mendedikasikan seluruh server dengan banyak RAM untuk database tersebut.

Dalam kasus Anda, Anda menggunakan tabel MyISAM (ekstensi file .MYD). Ini adalah format penyimpanan lama yang bekerja sangat baik untuk perangkat keras kelas bawah yang digunakan pada masa itu. Tapi hari ini, kami memiliki komputer yang sangat baik dan cepat. Itu sebabnya kami menggunakan InnoDB dan mengizinkannya menggunakan banyak RAM sehingga biaya I/O berkurang. Variabel dalam pertanyaan yang mengontrolnya disebut innodb_buffer_pool_size - googling yang akan menghasilkan hasil yang berarti.

Untuk menjawab pertanyaan - solusi yang efisien dan memuaskan adalah dengan menggunakan satu tabel tempat Anda menyimpan informasi sensor (id, judul, deskripsi) dan tabel lain tempat Anda menyimpan pembacaan sensor. Anda mengalokasikan RAM yang cukup atau penyimpanan yang cukup cepat (SSD). Tabel akan terlihat seperti ini:

CREATE TABLE sensors ( 
    id int unsigned not null auto_increment,
    sensor_title varchar(255) not null,
    description varchar(255) not null,
    date_created datetime,
    PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

CREATE TABLE sensor_readings (
    id int unsigned not null auto_increment,
    sensor_id int unsigned not null,
    date_created datetime,
    reading_value varchar(255), -- note: this column's value might vary, I do not know what data type you need to hold value(s)
    PRIMARY KEY(id),
    FOREIGN KEY (sensor_id) REFERENCES sensors (id) ON DELETE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

InnoDB, secara default, menggunakan satu flat-file untuk seluruh database/instalasi. Itu meringankan masalah melebihi batas deskriptor file dari OS / sistem file. Beberapa, atau bahkan puluhan juta catatan seharusnya tidak menjadi masalah jika Anda mengalokasikan 5-6 giga RAM untuk menyimpan kumpulan data yang berfungsi dalam memori - yang akan memungkinkan Anda mengakses data dengan cepat.

Jika saya merancang sistem seperti itu, ini adalah pendekatan pertama yang akan saya buat (secara pribadi). Dari sana, mudah untuk menyesuaikan tergantung pada apa yang perlu Anda lakukan dengan informasi tersebut.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghubungkan satu tabel ke banyak tabel yang berbeda?

  2. Buat Tabel Baru dengan Memilih Data dari Tabel Lain dengan CREATE TABLE AS

  3. Mengonversi string yang dibatasi menjadi beberapa nilai di mysql

  4. MySQL:Pisahkan daftar yang dipisahkan koma menjadi beberapa baris

  5. Saat menggunakan penguncian FOR UPDATE MySQL, apa yang sebenarnya dikunci?