Tenho uma tabela em meu banco de dados, que faz a representação dos dados de um ranking de jogadores em um joguinho bem simples.
Os dados são guardados no formato:
CREATE TABLE IF NOT EXISTS `ranking` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(30) NOT NULL,
`last_kill` varchar(30) NOT NULL,
`timestamp` int(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `last_kill` (`last_kill`),
KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2087147;
Todas as vezes que um jogador mata outro, é gravado o jogador que matou(name), o que morreu(last_kill) e o timestamp.
Para calcular os pontos do jogador, eu preciso calcular quantas vezes ele matou, e depois quantas vezes ele morreu, e diminuir o segundo do primeiro. Para fazer isso, eu preciso agrupar pelo "name", que apesar do nome é um numero e fazer um count. E fazer a mesma coisa com o last_kill com o id desse jogador.
Estou atualmente usando duas views diferentes para consultar o ranking semanal e mensal(Elas pegam os registros de uma semana pra frente e um mes pra frente respectivamente). Eu faço joins com os dados desses views e de outra tabela, e mesmo assim está sobrecarregando o servidor. Estou executando essas querys a cada 15 minutos pelo cronjob e gerando uma pagina em html simples com php, para que os usuários não executem todas as vezes que entrarem no site, mas mesmo assim, dá pra notar uma travada no servidor a cada 15 minutos.
Segue a baixo o export das views do ranking semanal. A primeira faz a tabela "id do jogador -> quantidade de pessoas que matou" e a segunda "id do jogador -> quantidade de vezes que morreu"
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `ranking_matou_kill` AS select `a`.`name` AS `char_id`,count(`a`.`name`) AS `points` from `ranking` `a` where (`a`.`timestamp` > (unix_timestamp() - (((60 * 60) * 24) * 7))) group by `a`.`name` order by count(`a`.`name`) desc;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `ranking_morreu_kill` AS select `a`.`last_kill` AS `char_id`,count(`a`.`last_kill`) AS `points` from `ranking` `a` where (`a`.`timestamp` > (unix_timestamp() - (((60 * 60) * 24) * 7))) group by `a`.`last_kill` order by count(`a`.`last_kill`) desc;
E o codigo que puxa os dados a cada 15 minutos:
SELECT c.name, ma.points as kills, mo.points as deaths, ma.points/mo.points as ratio, ma.points-mo.points as resultado
FROM `char` c
INNER JOIN ranking_matou_kill_month ma ON ma.char_id=c.char_id
INNER JOIN ranking_morreu_kill_month mo ON mo.char_id=c.char_id
ORDER BY resultado DESC LIMIT 0,100
Um amigo deu umas dicas, inclusive essa de usar as views, mas acho que não é suficiente ainda, precisava de alguém com mais experiencia.
Essa tabela tem atualmente 117mb, e está com dois milhoes de registros, e a previsão é que cresça bastante.
Já agradeço a paciencia de quem quer que leia, mesmo que não responda nada e antecipadamente de quem tentar ajudar.
Question
Mendigaum
Tenho uma tabela em meu banco de dados, que faz a representação dos dados de um ranking de jogadores em um joguinho bem simples.
Os dados são guardados no formato:
Todas as vezes que um jogador mata outro, é gravado o jogador que matou(name), o que morreu(last_kill) e o timestamp. Para calcular os pontos do jogador, eu preciso calcular quantas vezes ele matou, e depois quantas vezes ele morreu, e diminuir o segundo do primeiro. Para fazer isso, eu preciso agrupar pelo "name", que apesar do nome é um numero e fazer um count. E fazer a mesma coisa com o last_kill com o id desse jogador. Estou atualmente usando duas views diferentes para consultar o ranking semanal e mensal(Elas pegam os registros de uma semana pra frente e um mes pra frente respectivamente). Eu faço joins com os dados desses views e de outra tabela, e mesmo assim está sobrecarregando o servidor. Estou executando essas querys a cada 15 minutos pelo cronjob e gerando uma pagina em html simples com php, para que os usuários não executem todas as vezes que entrarem no site, mas mesmo assim, dá pra notar uma travada no servidor a cada 15 minutos. Segue a baixo o export das views do ranking semanal. A primeira faz a tabela "id do jogador -> quantidade de pessoas que matou" e a segunda "id do jogador -> quantidade de vezes que morreu" E o codigo que puxa os dados a cada 15 minutos:Um amigo deu umas dicas, inclusive essa de usar as views, mas acho que não é suficiente ainda, precisava de alguém com mais experiencia.
Essa tabela tem atualmente 117mb, e está com dois milhoes de registros, e a previsão é que cresça bastante.
Já agradeço a paciencia de quem quer que leia, mesmo que não responda nada e antecipadamente de quem tentar ajudar.
Edited by MendigaumLink to comment
Share on other sites
5 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.