À mesure que Golang devient de plus en plus populaire et largement utilisé, les développeurs se rendent progressivement compte que le langage Golang présente également certaines limites et limitations. L'un d'eux est la performance de Golang lors des opérations de pagination. Il est souvent impossible de tourner les pages. Cet article approfondira ce problème et proposera quelques solutions.
Pourquoi ne puis-je pas tourner les pages ?
Dans Golang, les opérations de pagination sont généralement implémentées via les mots-clés LIMIT et OFFSET des instructions SQL. LIMIT est utilisé pour spécifier le nombre maximum de lignes pour les résultats renvoyés, et OFFSET est utilisé pour spécifier le nombre initial de lignes pour les résultats de la requête. Par exemple :
SELECT * FROM table LIMIT 10 OFFSET 20
Cette instruction SQL renverra les résultats de 20 à 30 lignes du tableau.
Cependant, en raison des fonctionnalités du langage et du mécanisme d'implémentation de Golang, lorsque la quantité de données est importante, l'utilisation de l'instruction "SELECT *" et du mot-clé OFFSET entraînera un ralentissement de la requête ou même une erreur de délai d'attente. En effet, lorsque le pilote de base de données de Golang interroge des données, il met d'abord en cache toutes les données en mémoire, puis filtre en fonction des mots-clés OFFSET et LIMIT. Par conséquent, lorsque la quantité de données est très importante, la mémoire peut ne pas être suffisante pour stocker toutes les données, ce qui entraîne le blocage du programme ou l'impossibilité de renvoyer les données.
De plus, en raison des caractéristiques de Golang lui-même, goroutine doit être utilisé pour traiter les résultats des requêtes lors de l'exécution d'opérations de pagination afin d'utiliser pleinement les ressources du processeur. Cependant, en raison de la limitation des performances de concurrence des goroutines, lorsque la quantité de données est trop importante, les résultats de la requête peuvent être instables, entraînant l'échec de l'opération de changement de page.
Solution
Afin d'éviter l'impossibilité de tourner les pages, nous pouvons utiliser les méthodes suivantes :
Lors de l'utilisation des mots-clés LIMIT et OFFSET, nous pouvons obtenir les données via le Fonction COUNT Le nombre total de lignes, puis calcule le nombre de départ de lignes à interroger et le nombre de lignes renvoyées dans le programme. Par exemple, nous pouvons utiliser l'instruction SQL suivante :
SELECT COUNT(*) FROM table
Cette instruction SQL renverra le nombre total de lignes dans la table de données, que nous pouvons enregistrer sous la variable totalCount. Ensuite, nous pouvons calculer le nombre de lignes de départ et le nombre de lignes renvoyées des résultats de la requête via le code suivant :
pageSize := 20 // 每页显示的行数 pageIndex := 1 // 当前页码 startIndex := (pageIndex - 1) * pageSize // 起始行数 resultCount := pageSize // 返回的行数 if startIndex > totalCount { return nil, errors.New("startIndex is greater than totalCount") } if (totalCount - startIndex) < pageSize { resultCount = totalCount - startIndex }
Après avoir calculé le nombre de lignes de départ et le nombre de lignes renvoyées, nous pouvons utiliser l'instruction SQL suivante pour interroger les données :
SELECT * FROM table LIMIT resultCount OFFSET startIndex
L'utilisation de la fonction COUNT peut réduire la consommation de mémoire du programme et éviter les erreurs de délai d'expiration des requêtes.
De plus, nous pouvons éviter la situation où nous ne pouvons pas tourner les pages en optimisant l'instruction de requête. Par exemple, lors de l'interrogation d'une grande quantité de données dans une table de données, nous pouvons diviser l'instruction de requête en plusieurs petites instructions de requête, interroger une certaine quantité de données à chaque fois, puis fusionner ces données pour former le résultat final.
Par exemple, nous pouvons utiliser le code suivant pour lire des données :
rows, err := db.Query("SELECT * FROM table WHERE id >= ? AND id <= ?", startIndex, endIndex) defer rows.Close() if err != nil { return nil, err } for rows.Next() { // 将数据保存到slice中 // 最终将多个slice合并成一个slice }
Lors de l'interrogation de données, enregistrez les données de chaque requête dans une tranche, et enfin fusionnez plusieurs tranches en une seule tranche pour réduire le temps d'exécution des instructions de requête et l'utilisation de la mémoire.
De plus, nous pouvons également utiliser la pagination mémoire pour résoudre le problème de l'incapacité de tourner les pages. Lors de l'utilisation de la pagination de la mémoire, nous enregistrons toutes les données interrogées dans une tranche, puis renvoyons les données du numéro de page spécifié si nécessaire. Par exemple, nous pouvons utiliser le code suivant pour implémenter la pagination mémoire :
var list []interface{} // 保存所有数据的slice for rows.Next() { // 将数据保存到slice中 } totalCount := len(list) // 总行数 if pageSize * (pageIndex - 1) > totalCount { return nil, errors.New("startIndex is greater than totalCount") } startIndex := pageSize * (pageIndex - 1) endIndex := startIndex + pageSize if endIndex > totalCount { endIndex = totalCount } return list[startIndex:endIndex], nil // 返回指定页码的数据
Lors de l'utilisation de la pagination mémoire, nous pouvons utiliser pleinement les structures de données de Golang telles que les tranches et les tableaux pour terminer l'opération de tournage de page plus efficacement.
Résumé
Que vous utilisiez la fonction COUNT, optimisiez les instructions de requête ou utilisiez la pagination de la mémoire, vous pouvez efficacement éviter les problèmes qui peuvent survenir lors de l'opération de tournage de page de Golang. Cependant, dans les applications pratiques, nous devons encore combiner des scénarios et des besoins spécifiques, et faire des choix et des compromis en fonction des conditions réelles. Dans le même temps, nous devons également continuer à apprendre et à explorer pour tirer pleinement parti des avantages et des caractéristiques du langage Golang et fournir un support plus efficace et plus fiable à notre travail de développement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!