web-dev-qa-db-fra.com

Tokudb pas beaucoup plus vite que mysql

J'ai converti une base de données MySQL avec 80.000.000 rangées à Tokudb.

Maintenant quand je cours:

 select count(id) from xxx where active=1

il faut 90% du temps de la demande normale MySQL.

Qu'est-ce que je dois d'autres optimiser pour qu'il soit plus rapide?


La définition de la table:

CREATE TABLE `adsDelivered` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `uid` varchar(40) NOT NULL,
  `_adsDelivered` bigint(20) NOT NULL DEFAULT '0',
  `_campaign` bigint(20) NOT NULL DEFAULT '0',
  `_ad` bigint(20) NOT NULL DEFAULT '0',
  `session` varchar(44) NOT NULL,
  `referer` text NOT NULL,
  `refererDomain` varchar(256) NOT NULL,
  `pageTime` int(11) NOT NULL DEFAULT '0',
  `pageVisibleTime` int(11) NOT NULL DEFAULT '0',
  `browser` varchar(256) NOT NULL,
  `ip` varchar(15) NOT NULL,
  `clicks` int(11) NOT NULL DEFAULT '0',
  `clickTimeLast` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `tag` varchar(256) NOT NULL,
  `countryShort` varchar(2) NOT NULL,
  `timeCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `timeUpdated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',

  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`),
  KEY `_campaign` (`_campaign`),
  KEY `_ad` (`_ad`),
  KEY `_adsDelivered` (`_adsDelivered`),
  KEY `session` (`session`),
  KEY `tag` (`tag`),
  KEY `ip` (`ip`),
  KEY `countryShort` (`countryShort`),
  KEY `refererDomain` (`refererDomain`)
) ENGINE=TokuDB AUTO_INCREMENT=7420143 DEFAULT CHARSET=utf8;
6
Ploetzeneder

il faut 90% du temps de la demande normale MySQL.

Si cela prend moins de temps, alors il est plus rapide?

Tokudb est tout au sujet de l'utilisation efficace des SSD, en particulier pour la performance de l'écriture et la longévité - si la plupart de vos données convient à la mémoire, le Myisam et InnoDB seront beaucoup plus rapides pour aller chercher des données. Et ce ne sera pas plus rapide pour les repères à fil unique. Vous semblez avoir pris aucune mesure pour recréer les situations dans lesquelles Tokudb surperformez considérablement les autres moteurs et demandez une explication d'un scénario où il devrait être plus lent.

3
symcbean

Je ne pense pas qu'une requête de compte est jamais aller être représentative des forces de Toku. L'insertion de données dans 1 tir est également un problème pour un test sur un jeu de données avec des indices qui seront mis à jour constamment. Indépendamment de la question de savoir si cela convient à la mémoire, vous n'avez pas vieilli l'index afin que le BTREE soit gentil et soigné. Attendez quelques semaines et le BTREE sera plus fragmenté. Un arbre fractal ne va pas être fragmenté. Donc, c'est 1 défaut dans le test. Vous ne sélectionnez pas non plus rien. Une fois que vous le ferez, vous voudrez peut-être plus d'un indice en cluster, que InnoDB ne fera pas. La façon dont les indices secondaires fonctionnent sur Innodb sont ce que je déteste le plus à ce sujet.

Dans InnoDB, vous allez prendre un coup de contact le second que vous utilisez un indice non primaire, car il s'agit essentiellement de la déséroférance (une jointure quasi auto-jointure) un pointeur dans une position aléatoire à chaque ligne, un indice fait référence à. Il utilise une clé assez grande de 6 octets pour le faire. Je suis à peu près sûr que cela fait des choses horribles à la cache du matériel car vous rebondissez partout.

Selon ce que vous sélectionnez, les avantages d'un indice en cluster pourraient être énormes puisqu'il éviterait que quasi-jointure.

Mais qu'est ce que je sais? Je m'éloigne avec des inserts simultanés Myisam + sur de nombreuses choses =)

@symcbean Je crois que c'était l'intention originale de Toku (SSD), mais elle a finalement conduit à de grandes aspirations. Je me souviens vaguement d'un communiqué de presse à ce sujet.

Je m'attends également à ce que les gens soient compétitifs pour des lectures, sauf dans des environnements lus-lourds à bassetention où MVCC est surtout plus complexe. De plus, si les requêtes sont très ad-hoc qui se réfèrent à diverses colonnes sans une grande partie d'un motif, plusieurs index en cluster feront moins pour vous. Ne sous-estimez pas l'utilité de plusieurs index clusters lorsque vous avez dit ~ 5 types de requêtes qui font référence à ~ 5 tuples différents nécessitant une bande de choses à sélectionner. Esp. Sans SSD, c'est énorme. Pensez au principe de la localité. Innodb Secondary Index n'est pas amical pour faire tourner les disques. Je suppose que vous pouvez le pirater avec un index de couverture afin de ne pas avoir à faire cette quasi-jointure laide pour obtenir les autres colonnes, mais cela ne sera pas à l'échelle et que vous indexez beaucoup de choses pour rien (dit: Beaucoup de Gbs), en particulier sans compression. Vous réservez uniquement un préfixe de l'index. Donc, à moins que ce ne soit que 1-2 colonnes supplémentaires, c'est un horrible abus d'espace. Dans un indice en cluster, la ligne est juste une charge utile sur les feuilles.

Je ne sais toujours pas pourquoi InnoDB ne peut pas prendre en charge plus d'une index de clustering, peu importe. Ce serait utile même dans Myisam avec modération. Les personnes abusent des indices à imiter les indices en clusters à imiter tout le temps, et ce serait bien.

@Zardosht Même si cela convient à la mémoire, vous ne tiendrez pas les arbres plus équilibrés que les btrees au fil du temps, offrant une meilleure performance même dans ce cas?

En outre, pourquoi ne peut-on pas Toku faire un indice de clustering partiel. Et si vous ne le faites pas besoin Toute la ligne?

2
Jaimie Sirovich

Dans toute l'équité, Tokudb a des forces et des faiblesses contre Innodb.

InnoDB a un meilleur débit transactionnel que Tokudb jusqu'à ce que vous ayez touché un goulot d'étranglement qui met à la fois des moteurs de stockage au même niveau de lecture de niveau: compression de données.

Tokudb compriment toujours des données et enregistre un espace d'un facteur de 3 sur InnoDB. Ce qui a vérifié c'était un référence Percona entre les deux moteurs de stockage . Le test n'a pas pu être terminé car InnoDb a manqué de diskspace.

Dans le test, Innodb commençait à se dégrader, même s'il avait le meilleur débit. Au fil du temps et avec suffisamment de diskspace, une véritable évaluation peut être atteinte. IMHO, Tokudb ferait probablement mieux sur le long terme avec le débit/disques de disques considérés comme une seule métrique.

Compte tenu des index que vous avez, les choses peuvent être lentes avec l'utilisation de disques de disques car les index secondaires incluent des entrées RowID retour à l'index en cluster. Je ne peux pas faire cette même affirmation sur Tokudb depuis que je n'ai pas appris ses internes à ce moment-là.

2
RolandoMySQLDBA