From 14f5a25633f3724cb331592a63cb873f7b89f28d Mon Sep 17 00:00:00 2001 From: T00thpick1 Date: Sun, 13 Jan 2013 16:07:02 -0500 Subject: [PATCH] Speed up SQL powerless users purge --- Changelog.txt | 2 + .../nossr50/runnables/UserPurgeTask.java | 53 ++----------------- 2 files changed, 5 insertions(+), 50 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index be4a69f3c..dfe376a04 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -8,6 +8,8 @@ Key: - Removal Version 1.3.13-dev + + Overall SQL query improvements + + Reduced number of SQL queries for mcTop command from 11 to 1, speeding it up immensely + Added task to prune old and powerless users from the SQL database. *** WARNING: THIS WILL RUN AUTOMATICALLY ON YOUR DB. IF YOU ARE WORRIED *** *** ABOUT DATA LOSS, BACK UP YOUR SQL DATA BEFORE INSTALLING THIS BUILD *** diff --git a/src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java b/src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java index 9f9d42203..7326125eb 100644 --- a/src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java @@ -28,7 +28,7 @@ public class UserPurgeTask implements Runnable { @Override public void run() { if (Config.getInstance().getUseMySQL()) { - purgePowerlessSQLFaster(); + purgePowerlessSQL(); purgeOldSQL(); } else { @@ -38,55 +38,8 @@ public class UserPurgeTask implements Runnable { private void purgePowerlessSQL() { plugin.getLogger().info("Purging powerless users..."); - String query = "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing"; - HashMap> userslist = database.read("SELECT " + query + ", user_id FROM " + tablePrefix + "skills WHERE " + query + " = 0 ORDER BY " + query + " DESC "); - - int purgedUsers = 0; - - for (int i = 1; i <= userslist.size(); i++) { - int userId = Integer.valueOf(userslist.get(i).get(1)); - HashMap> username = database.read("SELECT user FROM " + tablePrefix + "users WHERE id = '" + userId + "'"); - - if (username == null) { - continue; - } - - String playerName = username.get(1).get(0); - - if (Bukkit.getOfflinePlayer(playerName).isOnline()) { - continue; - } - - database.write("DELETE FROM " + databaseName + "." + tablePrefix + "users WHERE " + tablePrefix + "users.id IN " + userId); - profileCleanup(playerName); - - purgedUsers++; - } - - plugin.getLogger().info("Purged " + purgedUsers + " users from the database."); - } - - private void purgePowerlessSQLFaster() { - plugin.getLogger().info("Purging powerless users..."); - String query = "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing"; - HashMap> userslist = database.read("SELECT " + query + ", user_id FROM " + tablePrefix + "skills WHERE " + query + " = 0 ORDER BY " + query + " DESC "); - - int purgedUsers = 0; - String userIdString = "("; - - for (int i = 1; i <= userslist.size(); i++) { - int userId = Integer.valueOf(userslist.get(i).get(1)); - - if (i == userslist.size()) { - userIdString = userIdString + userId + ")"; - } - else { - userIdString = userIdString + userId + ","; - } - } - - HashMap> usernames = database.read("SELECT user FROM " + tablePrefix + "users WHERE id IN " + userIdString); - database.write("DELETE FROM " + databaseName + "." + tablePrefix + "users WHERE " + tablePrefix + "users.id IN " + userIdString); + HashMap> usernames = database.read("SELECT u.user FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE s.user_id = u.id AND (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0"); + database.write("DELETE FROM " + tablePrefix + "users WHERE " + tablePrefix + "users.id IN (SELECT * FROM (SELECT u.id FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE s.user_id = u.id AND (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0) AS p)"); for (int i = 1; i <= usernames.size(); i++) { String playerName = usernames.get(i).get(0);