optimisation MySQL de performances des requêtes de MySQL table unique pagination d'un million d'enregistrements de données page d'optimisation des performances

l'optimisation des performances des requêtes de pagination limite MySQL

 

échange de requêtes Mysql est très simple, mais quand une grande quantité de données quand il porte la pagination générale.

requête d'appel traditionnelle: SELECT c1, c2, cn ... FROM table LIMIT n, m

MySQL est de limiter le principe de fonctionnement des n premiers enregistrements devant la lecture, puis jeter le premier n, et m est lu voulez plus tard, donc n, plus le décalage, plus la performance.

méthode de requête d'appel recommandée:

1, dans la mesure du possible compte tenu de la gamme approximative de requête

  1. SELECT c1 , c2 , cn ...  FROM table WHERE id > = 20000  LIMIT  10 ;

2, un procédé de sous-requête

  1. SELECT c1 , c2 , cn ...  FROM table WHERE id > =
  2. (
  3. SELECT id FROM table LIMIT  20000 , 1
  4. )
  5. LIMITE  10 ;

3, un livre de méthode d'index MySQL haute performance mentionné en lecture seule

Avant l'optimisation SQL:

  1. SELECT c1 , c2 , cn ...  DE membre ORDER BY LIMITE last_active  50 , 5

Optimisation SQL:

  1. SELECT c1 ,  c2 ,  cn  .. . 
  2. DE membre
  3. Jointure interne  ( SELECT MEMBER_ID à partir de membre ORDER BY LIMIT last_active  50 , 5 ) 
  4. UTILISATION  DE ( member_id )

La différence est que, SQL avant le besoin d'optimisation d'entrées / sorties à déchets, car l'index à lire, lire les données, puis jeter la ligne sans besoin. Le SQL (pièce sous-requête) index de lecture seule optimisé (indice de couverture) sur, puis lire les colonnes nécessaires member_id.

4, un premier ID de programme de lecture de l'étape, et ensuite le procédé pour la lecture d'un enregistrement désiré IN

lit programme ID:

  1. SELECT id FROM table LIMIT  20 000 , 10 ; 
  2. SELECT c1 ,  c2 ,  cn  .. .  FROM table WHERE id IN  ( ID1 ,  ID2 ,  idn .. .)  

 

 

==============

 

 

La performance de MySQL et de limiter l'utilisation de l'analyse des requêtes de recherche de personnes et d'optimisation

A, l'utilisation de la limite

Lorsque nous utilisons la requête, souvent de revenir aux précédentes quelques intermédiaires ou quelques lignes de données, cette fois comment le faire? Ne vous inquiétez pas, MySQL fournit déjà une telle fonction pour nous.

SELECT * FROM table LIMIT [offset,] rows | `rows OFFSET offset ` (LIMIT offset, `length`) SELECT * FROM table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000 

clause LIMIT peut être utilisée pour forcer le retour de l' instruction SELECT le nombre spécifié d'enregistrements. LIMITE prend un ou deux paramètres numériques . L'argument doit être une constante entière. Compte tenu de deux paramètres, le premier paramètre indique un retour à la première fiche de rangée 偏移量, le second argument spécifie le nombre maximal de lignes renvoyées . 初始记录行的偏移量是 0(而不是 1): Pour la compatibilité avec PostgreSQL, MySQL supporte aussi la syntaxe: # LIMIT OFFSET #.

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 

// Pour récupérer toutes les lignes d'une extrémité à l'ensemble d'enregistrement offset, le second paramètre peut spécifier -1:

mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. 

// donné un seul paramètre, ce qui représente le nombre maximum de lignes retournées:
mysql> SELECT * FROM table LIMIT 5; // récupérer les premières lignes 5
// En d' autres termes, LIMIT n équivalent à LIMIT 0,n .

En second lieu, la performance de la pagination analyse des requêtes Mysql

MySql sql déclaration d'appel, si la syntaxe TOP et MSSQL par rapport à la syntaxe LIMIT de MySQL si élégant à regarder beaucoup. Utilisez-le pour radiomessagerie est la chose la plus naturelle.

Le plus radiomessagerie de façon fondamentale:

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... 

Dans le cas de petites quantités de données, telles que SQL, suffisante, et le seul problème est de se assurer de noter l'utilisation de l'indice:
Par exemple, si l'instruction SQL réelle comme suit, puis category_id, id sur deux construire indice composite mieux :

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10 

sous-requête Pagination:

Comme la quantité de données augmente, de plus en plus de pages, SQL quelques pages après avoir vu il pourrait ressembler à :
SELECT * FROM articles WHERE category_id ORDER BY ci - dessus = 123 identifiant indiqué LIMITE 10000, 10

En un mot, qui est le plus en arrière LIMIT语句的偏移量就会越大,速度也会明显变慢pagination .
À ce stade, nous pouvons améliorer l' efficacité d'échange par des sous-requêtes, comme suit:

SELECT * FROM articles WHERE id >= (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10 

REJOIGNEZ pagination

SELECT * FROM `content` AS t1 JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2 WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize; 

Après mon test, joignez - vous paginée et l' efficacité paginée sous requête sur un niveau de base, la consommation de temps sont fondamentalement les mêmes.
expliquer instruction SQL:

id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY <derived2> system NULL NULL NULL NULL 1 1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where 2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index 

Pourquoi est-ce ainsi? Parce que la sous-requête est effectuée sur l'indice, alors qu'une enquête générale effectuée sur le fichier de données, d'une manière générale, le fichier d'index est beaucoup plus petit que le fichier de données, l'opération sera plus efficace.

Le modèle actuel peut utiliser une stratégie similaire pour faire face à la pagination de façon, par exemple pour déterminer si elle est inférieure à une centaine de pages, utilisez la pagination de façon la plus simple, plus d'une centaine, l'utilisation sous-requêtes paginations.

En troisième lieu, pour la table MySQL dispose d'une grande quantité de données, l'utilisation de la présence d'un très sérieux problèmes de performance page LIMIT.

Requête du dossier après le premier 30 1000000:

SQL代码1:平均用时6.6秒 SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30 SQL代码2:平均用时0.6秒 SELECT * FROM `cdb_posts` WHERE pid >= (SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1) LIMIT 30 

Pour ce qui est supprimer tout le contenu du champ , de grandes quantités de données doivent traverser le premier bloc et retiré, tandis que le second sensiblement directement 根据索引字段定位后,才取出相应内容, d' améliorer considérablement l'efficacité des ressources naturelles. La limite d'optimisation, la limite n'est pas utilisé directement, mais d' abord à obtenir id offset, puis utilisé la taille limite directement pour obtenir les données.

Comme on peut le voir, la page suivante, le décalage sera plus grande instruction LIMIT, à la fois l'écart de vitesse sera plus évidente.

Les applications pratiques, vous pouvez utiliser une stratégie similaire pour traiter le mode d'échange de manière, par exemple, pour déterminer si elle est inférieure à une centaine de pages, utilisez la pagination de façon la plus simple, plus d'une centaine, l'utilisation paginations sous-requêtes.

idée d'optimisation:避免数据量大时扫描过多的记录

Afin d'assurer l'indice continu de colonne d'index, chaque table peut être ajouté à un champ d'auto-énergisant, et l'ajout d'index

Référence: pagination mysql offset est trop grande, l'expérience d'optimisation Sql

 

 

========

 

 

MySQL table unique d'un million d'enregistrements de données Page optimisation des performances

contexte:

Vous possédez un site web, puisque les données enregistrées à une seule table d'un million, ce qui l'accès aux données très lent, analyse, fond délai Google rapport régulier, en particulier les grandes pages page ne tarde pas.

Environnement de test:

Laissez-nous être familier avec instruction SQL de base, la prochaine, nous allons voir un test de la table d'information de base

utiliser infomation_schema
SELECT * FROM tables où TABLE_SCHEMA = 'dbname' ET TABLE_NAME = 'produit'

Résultats de la requête:

A partir de la figure ci-dessus, nous pouvons voir le tableau d'information de base:

Tableau rangées: 866 633
longueur de données moyenne de chaque ligne: 5133 octets
Taille de table unique: 4,448,700,632 bytes

A propos de la taille des lignes de la table et l'unité est octets, nous savons que après avoir calculé
la longueur de la ligne moyenne: environ 5 km
seule table Taille totale: 4.1g
types champ de table a varchar, datetime, texte, etc., id champ clé primaire

test test

1. Direct avec démarrage limite, l'énoncé de la page de compte, que j'ai utilisé dans la méthode du programme:

select * du début de course de produit, compter
que la page de démarrage est petite, il n'y a pas de problèmes de performances des requêtes, nous examinons respectivement de 10, 100, 1000, 10000 temps d'exécution pour commencer la recherche (page Prélever 20), comme suit:

sélectionner * de limite de produit 10, 20 0,016秒
select * from limite de produit 100, 20 0,016秒
select * de limite de produit 1000, 20 0,047秒
select * from limite de produit 10000, 20 0,094秒

Nous avons vu que l'augmentation de l'enregistrement initial, le temps aussi avec l'augmentation, ce qui indique la limite de déclaration de pagination avec le numéro de page de départ est une excellente relation, nous commençons à enregistrer le changement de vue 40W (c.-à-enregistrement généralement environ) select * from limite de produit 400000, 20 3,229 secondes

Nous examinons la dernière fois enregistré
select * from limite de produit 866613, 20 37,44 Miao

Pas étonnant que les moteurs de recherche exploration de la page nous rapportent souvent un délai d' attente, comme la plus grande PAGE de cette page De toute évidence, cette fois
entre est intolérable.

D'où l' on peut résumer deux choses:
1) états limites de temps de requête à la position du début de l'enregistrement est proportionnelle à
2) mysql l'instruction limite est très pratique, mais la plupart des enregistrements de la table ne sont pas adaptés à une utilisation directe.

2. problème d'optimisation de la performance limite à la pagination

Couvrant l'utilisation de la table d'index pour accélérer la pagination requête
nous le savons tous, l'utilisation de la requête d'index si l'instruction ne contient que la colonne d'index (couvrant les index), cette situation va bientôt des requêtes.

Parce que l'utilisation de l'indice des algorithmes d'optimisation La recherche et les données d'index dans la requête ci-dessus, ne pas aller pour répondre aux données pertinentes, cela permet d'économiser beaucoup de temps. De plus Mysql est également lié au cache d'index, à un moment de meilleure utilisation élevée des effets de mise en cache concurrence.

Dans notre exemple, nous savons que le champ id est la clé primaire, contient naturellement l'index de clé primaire par défaut. Maintenant, nous allons voir comment utiliser un résultat de requête d'index de couverture:

La dernière page des données de requête (couvrant l'utilisation de l'index ne contient que la colonne id), comme suit parmi nous:
l'id SELECT de limite de produit 866 613, 20 0,2 Miao par
rapport à interroger toutes les colonnes de 37,44 secondes pour améliorer d'environ 100 fois vitesse

Donc, si nous devons interroger toutes les colonnes, il y a deux façons, on est l'id> = forme, et l'autre est d'utiliser rejoindre, regardez la situation actuelle:

SELECT * FROM produit WHERE ID> = (select id de limite de produit 866613, 1) 20 limite de
temps d'interrogation est de 0,2 secondes, et est tout simplement un ah saut qualitatif, ha

Une autre façon
SELECT * FROM produit JOIN (select id de limite de produit 866613, 20) b = ON a.ID b.id
temps requête est très courte, comme!

En fait, à la fois un principe à la place, donc l'effet est presque

contexte:

Vous possédez un site web, puisque les données enregistrées à une seule table d'un million, ce qui l'accès aux données très lent, analyse, fond délai Google rapport régulier, en particulier les grandes pages page ne tarde pas.

Environnement de test:

Laissez-nous être familier avec instruction SQL de base, la prochaine, nous allons voir un test de la table d'information de base

utiliser infomation_schema
SELECT * FROM tables où TABLE_SCHEMA = 'dbname' ET TABLE_NAME = 'produit'

Résultats de la requête:

A partir de la figure ci-dessus, nous pouvons voir le tableau d'information de base:

Tableau rangées: 866 633
longueur de données moyenne de chaque ligne: 5133 octets
Taille de table unique: 4,448,700,632 bytes

A propos de la taille des lignes de la table et l'unité est octets, nous savons que après avoir calculé
la longueur de la ligne moyenne: environ 5 km
seule table Taille totale: 4.1g
types champ de table a varchar, datetime, texte, etc., id champ clé primaire

test test

1. Direct avec démarrage limite, l'énoncé de la page de compte, que j'ai utilisé dans la méthode du programme:

select * du début de course de produit, compter
que la page de démarrage est petite, il n'y a pas de problèmes de performances des requêtes, nous examinons respectivement de 10, 100, 1000, 10000 temps d'exécution pour commencer la recherche (page Prélever 20), comme suit:

sélectionner * de limite de produit 10, 20 0,016秒
select * from limite de produit 100, 20 0,016秒
select * de limite de produit 1000, 20 0,047秒
select * from limite de produit 10000, 20 0,094秒

Nous avons vu que l'augmentation de l'enregistrement initial, le temps aussi avec l'augmentation, ce qui indique la limite de déclaration de pagination avec le numéro de page de départ est une excellente relation, nous commençons à enregistrer le changement de vue 40W (c.-à-enregistrement généralement environ) select * from limite de produit 400000, 20 3,229 secondes

Nous examinons la dernière fois enregistré
select * from limite de produit 866613, 20 37,44 Miao

Pas étonnant que les moteurs de recherche exploration de la page nous rapportent souvent un délai d' attente, comme la plus grande PAGE de cette page De toute évidence, cette fois
entre est intolérable.

D'où l' on peut résumer deux choses:
1) états limites de temps de requête à la position du début de l'enregistrement est proportionnelle à
2) mysql l'instruction limite est très pratique, mais la plupart des enregistrements de la table ne sont pas adaptés à une utilisation directe.

2. problème d'optimisation de la performance limite à la pagination

Couvrant l'utilisation de la table d'index pour accélérer la pagination requête
nous le savons tous, l'utilisation de la requête d'index si l'instruction ne contient que la colonne d'index (couvrant les index), cette situation va bientôt des requêtes.

Parce que l'utilisation de l'indice des algorithmes d'optimisation La recherche et les données d'index dans la requête ci-dessus, ne pas aller pour répondre aux données pertinentes, cela permet d'économiser beaucoup de temps. De plus Mysql est également lié au cache d'index, à un moment de meilleure utilisation élevée des effets de mise en cache concurrence.

Dans notre exemple, nous savons que le champ id est la clé primaire, contient naturellement l'index de clé primaire par défaut. Maintenant, nous allons voir comment utiliser un résultat de requête d'index de couverture:

La dernière page des données de requête (couvrant l'utilisation de l'index ne contient que la colonne id), comme suit parmi nous:
l'id SELECT de limite de produit 866 613, 20 0,2 Miao par
rapport à interroger toutes les colonnes de 37,44 secondes pour améliorer d'environ 100 fois vitesse

Donc, si nous devons interroger toutes les colonnes, il y a deux façons, on est l'id> = forme, et l'autre est d'utiliser rejoindre, regardez la situation actuelle:

SELECT * FROM produit WHERE ID> = (select id de limite de produit 866613, 1) 20 limite de
temps d'interrogation est de 0,2 secondes, et est tout simplement un ah saut qualitatif, ha

Une autre façon
SELECT * FROM produit JOIN (select id de limite de produit 866613, 20) b = ON a.ID b.id
temps requête est très courte, comme!

En fait, à la fois un principe à la place, donc l'effet est presque

Je suppose que tu aimes

Origine www.cnblogs.com/xiami2046/p/12630374.html
conseillé
Classement