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
Pouvez-vous fournir votre my.cnf et la définition de la table? –
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. –
Quelle est la sélectivité de la colonne catégorie? Peut-être un index ne vous aidera pas à sélectionner * du tout .... –