MySQL - optimizasyonu ile yardım edin, ben emin değilim nasıl

2 Cevap php

Biraz sizin benim tabloları optimize yardımcı olabilir eğer şu anda, çünkü aşağıdaki sorunlardan yürütmek için çok uzun sürebilir gibi ben gerçekten takdir ediyorum:

Ana tablo:

game {
   game_id [PRIMARY KEY]
   *team_id
   *stadium_id
   home_score
   opponent_score
   date
   tour
   half_home_score
   half_opp_score
   attendance
   referee_id
   coach_id
   captain_id
}

players (contains all players that played in the game) {
    *game_id
    *team_id
    *player_id
    position
    number
}

tries, conversions, penalties, dropgoals {
    *player_id
    *game_id
    *team_id
}

team {
    team_id [PRIMARY KEY]
    country
}

player {
    player_id [PRIMARY KEY]
    *team_id
    name
    surname
    fullname
    DOB
    POB
    school
    height
    weight
    position
}

I tend to make all *_id's of type (UNSIGNED INT[5])? I am a bit unsure if UNSIGNED is needed

All text is VARCHAR(500..200) depending on the size needed

I use DATE type where I can eg. DOB, date

'*' - Diğer tablolardaki birincil anahtarlar, yabancı anahtarlarını belirtir

Bir sayfa ne olur şudur, özellikle yavaş:

Sayfa çok benim sorguları aşağıdaki gibidir, belirli bir oyun için oyuncuların sanatçısını gösterir:

SELECT all player_id's,number,position FROM players table WHERE game_id is specific game's id getTries(player_id,game_id) from tries table . . getDropgoals(player_id,game_id) from dropgoals table

player tablosundan getPlayerName (player_id)

Masaya çıktı Alınan ayrıntıları

<tr>
<td>tries</td>...<td>dropgoals</td><td>position</td><td>player's name</td><td>number</td></tr>

Birisi görünür bazı tuzaklar işaret eğer ben gerçekten takdir ediyorum.

Selamlar

/ / Düzenle

Ben aşağıdaki sorgu kullanmış, ama sadece çalışır tabloda bulunan satır çıktılar, ben tüm oyuncular buldum çıkış istiyorum, ancak denemeden sayısı hiç denemeden bu oyuncu için attı olsaydı diye, attı ki saymak o denemeden için oyuncuların bilgilerini ama 0 must yine çıkış attı.

I am not sure if my query is correct: SELECT ps.player_id, ps.position, ps.number, p.name, p.surname, COUNT(*) AS triesNo FROM players ps, player p, tries WHERE p.player_id=ps.player_id AND ps.game_id = '$game_id' AND ps.team_id IS NULL AND tries.player_id = ps.player_id GROUP BY ps.player_id ORDER BY ps.number

Ben o hiç denemeden attı eğer o da o bir deneyin attı eğer şimdi sadece çalar verir, bir oyuncu dönmek istiyorum.

Kimse lütfen yardımcı olabilir misiniz?

2 Cevap

O sesler bir sayfa yük, ya da aynı anda birden fazla tablodan seçerek eğer (b), uygun alanlara verileri katılmadan değil çok sayıda sorguları çalıştıran (a) olabilir.

Eğer söylediklerini Örneğin, oyuncu isimleri almak için sorguları bir bütün set çalışan almak için görünür, ama bunu gibi ilk sorgusu ile bu birleştirebilirsiniz:

SELECT ps.player_id, ps.position, ps.number, p.name
FROM players ps, player p
WHERE p.player_id=ps.player_id

Bu sorgu player_id iki tabloyu birleştiren, ve id / konumu / numara / isim ile oyuncular bir dizi ile sonuna kadar.

Ayrıca indeksler içine bakmak isteyebilirsiniz. Bu endeksi için iyi bir fikirdir (zaten bir birincil anahtarla endeksli olmayan) bir WHERE yan tümcesinde kullanılan herhangi bir alan (lar).

Diğerleri, söylediğim gibi, sen sorguları yavaş çalışan ne ile daha belirli olması gerekir.

İmzasız bir büyük (çift boyutu) int id sütunu var sağlayacaktır. Dezavantajı (zaten, kötülük) negatif kimlikleri kullanmak mümkün olmayacak olurdu.