From f01bd675c0a6cb2d7832053cef23718d9783d8f9 Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Sun, 7 Nov 2004 21:53:55 +0000
Subject: [PATCH] - Performance improvement: made 'sid' the primary key of the
 sessions table.   That should improve performance of session handling as well
 improve   performance of the "Who's online"-block.  Drupal.org's sessions
 table   contains appr. 40.000 sessions on a slow day and rendering the "Who's
   online"-block became a performance bottleneck.

  This change has yet to be tested on a busy site so things might go wrong.
---
 database/database.mysql  |  2 +-
 database/updates.inc     | 13 ++++++++++++-
 includes/session.inc     |  2 +-
 modules/user.module      |  2 +-
 modules/user/user.module |  2 +-
 5 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/database/database.mysql b/database/database.mysql
index f8be88bbc965..7e84788527a3 100644
--- a/database/database.mysql
+++ b/database/database.mysql
@@ -567,7 +567,7 @@ CREATE TABLE sessions (
   timestamp int(11) NOT NULL default '0',
   session longtext,
   KEY uid (uid),
-  KEY sid (sid),
+  PRIMARY KEY sid (sid),
   KEY timestamp (timestamp)
 ) TYPE=MyISAM;
 
diff --git a/database/updates.inc b/database/updates.inc
index e135ae431962..148119757335 100644
--- a/database/updates.inc
+++ b/database/updates.inc
@@ -86,7 +86,8 @@
   "2004-09-17" => "update_107",
   "2004-10-16" => "update_108",
   "2004-10-18" => "update_109",
-  "2004-10-31: first update since Drupal 4.5.0 release" => "update_110"
+  "2004-10-31: first update since Drupal 4.5.0 release" => "update_110",
+  "2004-11-07" => "update_111"
 );
 
 function update_32() {
@@ -1966,6 +1967,16 @@ function update_110() {
   return $ret;
 }
 
+function update_111() {
+  $ret = array();
+
+  if ($GLOBALS['db_type'] == 'mysql') {
+    $ret[] = update_sql('ALTER TABLE {sessions} ADD PRIMARY KEY sid (sid)');
+  }
+
+  return $ret;
+}
+
 function update_sql($sql) {
   $edit = $_POST["edit"];
   $result = db_query($sql);
diff --git a/includes/session.inc b/includes/session.inc
index 91351d7d4fc6..5155dab7f2a4 100644
--- a/includes/session.inc
+++ b/includes/session.inc
@@ -25,8 +25,8 @@ function sess_read($key) {
   $result = db_query_range("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = '%s' AND u.status < 3", $key, 0, 1);
 
   if (!db_num_rows($result)) {
-    $result = db_query("SELECT u.* FROM {users} u WHERE u.uid = 0");
     db_query("INSERT INTO {sessions} (uid, sid, hostname, timestamp) values(%d, '%s', '%s', %d)", $user->uid, $key, $_SERVER["REMOTE_ADDR"], time());
+    $result = db_query("SELECT u.* FROM {users} u WHERE u.uid = 0");
   }
 
   $user = db_fetch_object($result);
diff --git a/modules/user.module b/modules/user.module
index 7c5ca77be5e7..d6ee673df054 100644
--- a/modules/user.module
+++ b/modules/user.module
@@ -563,7 +563,7 @@ function user_block($op = 'list', $delta = 0, $edit = array()) {
           $time_period = variable_get('user_block_seconds_online', 2700);
 
           // Perform database queries to gather online user lists.
-          $guests = db_fetch_object(db_query('SELECT COUNT(DISTINCT(sid)) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
+          $guests = db_fetch_object(db_query('SELECT COUNT(sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
           $users = db_query('SELECT DISTINCT(uid), MAX(timestamp) AS max_timestamp FROM {sessions} WHERE timestamp >= %d AND uid != 0 GROUP BY uid ORDER BY max_timestamp DESC', time() - $time_period );
           $total_users = db_num_rows($users);
 
diff --git a/modules/user/user.module b/modules/user/user.module
index 7c5ca77be5e7..d6ee673df054 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -563,7 +563,7 @@ function user_block($op = 'list', $delta = 0, $edit = array()) {
           $time_period = variable_get('user_block_seconds_online', 2700);
 
           // Perform database queries to gather online user lists.
-          $guests = db_fetch_object(db_query('SELECT COUNT(DISTINCT(sid)) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
+          $guests = db_fetch_object(db_query('SELECT COUNT(sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
           $users = db_query('SELECT DISTINCT(uid), MAX(timestamp) AS max_timestamp FROM {sessions} WHERE timestamp >= %d AND uid != 0 GROUP BY uid ORDER BY max_timestamp DESC', time() - $time_period );
           $total_users = db_num_rows($users);
 
-- 
GitLab