2011-01-20 1 views
0

J'ai un simple mysql db fonctionnant sur un serveur avec deux tables: produits et avis. table des produits a environ 10 millions d'entrées et le tableau des commentaires a environ 30 millions d'entrées.Les tables avec des entrées 30mln sont lentes. Optimiser MySQL ou passer à mongodb?

Le Db entier est d'environ 30Gb. J'ai l'impression que ça devient lent et je me demande ce que je devrais faire à ce sujet. J'ai créé des index, mais cela n'a pas aidé. Par exemple, la table des produits a un champ catégorie et quand je fais un simple select * from products where category=2 - c'est juste lent.

Le passage à mongodb m'aidera-t-il dans cette situation ou je peux résoudre cela simplement en optimisant Mysql? Dans ce cas, est-ce que je devrais faire le sharding ou la taille des tables n'est pas si grand et il est possible d'optimiser l'autre manière?

Tables et my.cnf

CREATE TABLE IF NOT EXISTS `products` (
    `id` int(11) NOT NULL auto_increment, 
    `product_title` varchar(1000) NOT NULL, 
    `product_id` varchar(100) NOT NULL, 
    `title` varchar(1000) NOT NULL, 
    `image` varchar(1000) NOT NULL, 
    `url` varchar(1000) NOT NULL, 
    `price` varchar(100) NOT NULL, 
    `reviews` int(11) NOT NULL, 
    `stars` float NOT NULL, 
    `BrowseNodeID` int(11) NOT NULL, 
    `status` varchar(100) NOT NULL, 
    `started_at` int(15) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `id_index` (`BrowseNodeID`), 
    KEY `status_index` (`status`), 
    KEY `started_index` (`started_at`), 
    KEY `id_ind` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13743335 ; 


CREATE TABLE IF NOT EXISTS `reviews` (
    `id` int(11) NOT NULL auto_increment, 
    `product_id` varchar(100) NOT NULL, 
    `product_title` varchar(1000) NOT NULL, 
    `review_title` varchar(1000) NOT NULL, 
    `content` varchar(5000) NOT NULL, 
    `author` varchar(255) NOT NULL, 
    `author_profile` varchar(1000) NOT NULL, 
    `stars` float NOT NULL, 
    `owner` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `product_id` (`product_id`), 
    KEY `id_index` (`product_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=48129737 ; 

Quelques infos de my.cnf

set-variable = query_cache_size=1512M 
set-variable = thread_cache_size=8 
thread_concurrency = 8 
skip-innodb 
low-priority-updates 
delay-key-write=ALL 

key_buffer_size = 100M 
max_allowed_packet = 1M 
#table_open_cache = 4048 
sort_buffer_size = 2M 
read_buffer_size = 2M 
read_rnd_buffer_size = 8M 
myisam_sort_buffer_size = 50M 
set-variable = table_cache=256 
set-variable = query_cache_limit=1024M 
set-variable = query_cache_size=1024M 
+0

Pouvez-vous fournir votre my.cnf et la définition de la table? –

+3

Qu'est-ce que c'est «lent»? Aucun détail sur les tables impliquées, les index ou les requêtes/requêtes impliquées - ressemble plus à une justification que vous souhaitez utiliser pour passer à mongodb. –

+1

Quelle est la sélectivité de la colonne catégorie? Peut-être un index ne vous aidera pas à sélectionner * du tout .... –

Répondre

3

Sur la base de votre my.cnf, il semble que votre key_buffer_size est façon trop petit, donc vous allez sur disque pour chaque lecture. Idéalement, cette valeur doit être supérieure à la taille totale de vos index MyISAM. Avant de modifier les technologies DB, vous pouvez également envisager de modifier votre type de table en InnoDB. Votre my.cnf l'a désactivé, maintenant. J'ai obtenu des performances remarquables sur une table en ligne de 300M avec des index intelligents et assez de mémoire. InnoDB vous donnera également une marge de manœuvre avec des lectures plus longues, car elles ne verrouilleront pas toute votre table.

+0

Merci pour vos conseils. 300M? C'est impressionnant! Tout sur le même serveur et dans une seule table? Pas de sharding? Combien de RAM avez-vous eu? Avez-vous pu faire des requêtes simples avec WHERE ou commander? – Arty

+1

@Arty - http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right-one-on-a/4421601#4421601 (mon bureau) –

Questions connexes