Enormno podatkov, sesutje serverja

Pozdravljeni mojstri!

Prvič se srečujem z zelo zelo veliko bazo podatkov v PHP/MySQL.
Imam tabelo ki im trenutno 2,571,934 zapisov. Notri je kar precej polj z veliko podatki.

Za potrebe statistike moram čez vsa ta polja spustiti:

$where = "user1Id = '".$id."' OR user2Id='".$id."' OR user3Id='".$id."' OR user4Id='".$id."'";

da najdem uporabnika in vse njegove rezultate. Baza se takoj sesuje ko to spustim skozi.
Kakšne so rešitve in alternative.. Kaj uporabiti, oz. kaj iskati pri Googlu?

Uporabljam CodeIgniter.

Hvala!

23 odgovorov

@MitjaST: Jap, sem dal po nekaj polj samo in je malce boljše.

@SlimDeluxe:
1. Hm. Zdaj, rabim kar dosti podatkov. Rabim vse njegove igre za obdobja. Recimo enega meseca, potem pol leta, eno leto, in pa vse podatke za vse njegove igre. Ker ne vem na katerem mestu v user1id, user2Id,.. je ne morem njegovih točk ven potegnat. Za potrebe statistike rabim še kolikokrat je vse igre igral, koliko točk je dosegel, potem datumsko kdaj je to igral.. Tako da več ali manj rabim vse ali se motim?

  1. Uf uf, binding uporabljam skos, zdaj sicer delam raw toliko da spravim v delujoče stanje. Tale free results je VELIKO rešil, zdaj vsaj podatke naloži, vendar še kar par sekund traja (5s). Takle je zdaj SQL:
$where = "user1Id = '".$id."' OR user2Id='".$id."' OR user3Id='".$id."' OR user4Id='".$id."'";
$query = $this->db->query("SELECT user1Points, user2Points, user3Points, user4Points, startedOn FROM tarok_game WHERE $where");
$results = $query->result();
$query->free_result();
return $results;

<3

zaay123:
@MitjaST: Jap, sem dal po nekaj polj samo in je malce boljše.

@SlimDeluxe:
1. Hm. Zdaj, rabim kar dosti podatkov. Rabim vse njegove igre za obdobja. Recimo enega meseca, potem pol leta, eno leto, in pa vse podatke za vse njegove igre. Ker ne vem na katerem mestu v user1id, user2Id,.. je ne morem njegovih točk ven potegnat. Za potrebe statistike rabim še kolikokrat je vse igre igral, koliko točk je dosegel, potem datumsko kdaj je to igral.. Tako da več ali manj rabim vse ali se motim?

  1. Uf uf, binding uporabljam skos, zdaj sicer delam raw toliko da spravim v delujoče stanje. Tale free results je VELIKO rešil, zdaj vsaj podatke naloži, vendar še kar par sekund traja (5s). Takle je zdaj SQL:
$where = "user1Id = '".$id."' OR user2Id='".$id."' OR user3Id='".$id."' OR user4Id='".$id."'";
$query = $this->db->query("SELECT user1Points, user2Points, user3Points, user4Points, startedOn FROM tarok_game WHERE $where");
$results = $query->result();
$query->free_result();
return $results;

<3

Za te opcije uporabljal ukaze v MYSQLu in ne PHP.

Npr: Group BY + COUNT, SUM, ...

Hjoj spet težave. Zdaj bi rad teh 2,5 mio podatkov omejil na časovni čas glede na polje startedOn.. se pravi recimo podatke za en mesec. Spet memory limit, potem sem dal še na startedOn index pa spet.

Podatke dobivam takole:

$query = $this->db->select("startedOn");
            $query = $this->db->where('startedOn BETWEEN "'. date('Y-m-d', strtotime($from)). '" and "'. date('Y-m-d', strtotime($to)).'"');

            $query = $this->db->get("tarok_game");

            $results = $query->result();
            $query->free_result();
            return $results;

Nevem več kaj naj naredim da bi tole hitreje delovalo oz. da se nebo sesuvalo.