Latar Belakang
Database lokal berisi hampir 1,3 miliar baris unik. Setiap baris secara tidak langsung dikaitkan dengan garis lintang dan garis bujur tertentu (lokasi). Setiap baris memiliki cap tanggal.
Gunakan Kasing
Masalahnya adalah sebagai berikut:
- Pengguna menetapkan tanggal mulai / berakhir, dan rentang nilai (misalnya, 100 hingga 105).
- Sistem mengumpulkan semua baris yang cocok dengan tanggal yang diberikan, dikelompokkan berdasarkan lokasi.
- Performa sistem menentukan lokasi yang, selama tanggal tersebut, memiliki kemungkinan statistik untuk jatuh ke dalam kisaran nilai yang diberikan.
- Sistem menampilkan semua lokasi yang cocok kepada pengguna.
Ini adalah masalah kecepatan dan skala.
Pertanyaan
Apa arsitektur solusi paling murah yang dapat Anda bayangkan yang memungkinkan sistem seperti itu untuk mengambil hasil untuk pengguna dalam waktu kurang dari lima detik?
Sistem saat ini
Lingkungan saat ini:
- PostgreSQL 8.4 (upgrade dimungkinkan; berpindah basis data bukan pilihan)
- R dan PL / R
- XFS
- WD VelociRaptor
- RAM 8 GB (Corsair G.Skill; 1,3 GHz)
- Quad core GenuineIntel 7 (2,8 GHz)
- Ubuntu 10.10
Pembaruan perangkat keras dapat diterima.
Pembaruan - Struktur Database
Miliaran baris berada dalam tabel yang menyerupai:
id | taken | location_id | category | value1 | value2 | value3
- id - Kunci utama
- diambil - Tanggal ditetapkan ke baris
- location_id - Referensi ke garis lintang / bujur
- kategori - Deskripsi data
- value1 .. 3 - Nilai lain yang dapat ditanyakan pengguna
The taken
kolom biasanya tanggal berturut-turut per location_id
, kadang-kadang setiap lokasi memiliki data yang 1800-2010 (sekitar 77.000 tanggal, banyak dari mereka diduplikasi karena masing-masing lokasi memiliki data dalam rentang tanggal yang sama).
Ada tujuh kategori dan tabel sudah dibagi berdasarkan kategori (menggunakan tabel anak). Setiap kategori berisi ~ 190 juta baris. Dalam waktu dekat, jumlah baris per kategori akan melebihi satu miliar.
Ada sekitar 20.000 lokasi dan 70.000 kota. Lokasi berkorelasi dengan kota dengan garis lintang dan bujur. Menugaskan setiap lokasi ke kota tertentu berarti menemukan batas kota, yang bukan tugas sepele.
Ide ide
Beberapa ide yang saya miliki meliputi:
- Temukan layanan cloud untuk meng-host basis data.
- Buat garis raid SSD (video hebat).
- Buat tabel yang menggabungkan semua lokasi dengan kota (pra-perhitungan).
Terima kasih!