Brazil's biggest MU Online portal — since 2003
Tutorial Advanced Server

How to configure the RankingServer on your MU Online server

Learn how to configure a RankingServer to display reset, master and guild rankings on your MU Online server, with data collection, automatic updates and site integration.

GA Gabriel · Updated on Jan 10, 2026 · ⏱ 16 min read
Quick answer

A well-made ranking is one of the biggest engagement drivers for a MU Online server. Seeing your own name climb the reset list, competing for the top of the master ranking or fighting for the lead among guilds keeps players connected and competitive. Behind this seemingly simple showcase there is im

A well-made ranking is one of the biggest engagement drivers for a MU Online server. Seeing your own name climb the reset list, competing for the top of the master ranking or fighting for the lead among guilds keeps players connected and competitive. Behind this seemingly simple showcase there is important technical work: collecting the correct data from the database, computing the rankings without freezing the server, refreshing the information at appropriate intervals and integrating everything into the site securely. This is where the RankingServer comes in — whether as a dedicated service or as a set of routines and queries that feed the display. In this tutorial you will learn the most common ranking types, how to collect data without overloading the production base, how to schedule the update, how to integrate with the site and which errors to avoid. It is an advanced topic because it mixes database work, scheduling and display security.

Prerequisites

This guide assumes the server is already operational and has players generating data. If you are still setting up the base, start with the tutorial on how to create a MU Online server and come back when there are already accounts and characters in the database.

  • A working MU Online server with a database (usually SQL Server, but varies by emulator).
  • Administrative access to the database (a user with read permission and permission to create tables/procedures).
  • Basic SQL knowledge to write and adjust queries.
  • A server site/panel (usually in PHP) where the ranking will be displayed.
  • An available scheduling tool (SQL Server Agent, Windows Task Scheduler or cron, depending on the environment).
  • A database backup before creating new objects.

Ranking types in MU Online

Before configuring, you need to know what to display. The most established rankings in MU culture are:

RankingBased onNotes
ResetCharacter's reset countThe most popular; usually broken by level and experience
MasterMaster LevelRelevant in seasons with a master system
GuildGuild score/pointsSum of member contributions, Castle Siege wins, etc.
LevelCharacter levelCommon on no-reset or long-progression servers
PK/KillsPvP killsRequires handling to avoid kill farming
GensGens system scorePresent in seasons that have the system
EventsWins in Blood Castle, Devil Square, CCDepends on the emulator recording these metrics

Not every emulator records all of these metrics in the database. The first practical step is to find out where each piece of data lives in your database's tables, since column and table names vary by emulator.

Understanding where the data comes from

In MU Online, the information relevant to the ranking usually sits in a few central tables. The names below are illustrative and change depending on the emulator:

  • Character table (e.g., Character) — usually holds Name, cLevel, Resets, MasterLevel, Class, Experience.
  • Guild table (e.g., Guild) — name, mark, guild master, score.
  • Guild member table (e.g., GuildMember) — link between character and guild.
  • Event or specific-ranking tables, when they exist.

The first job is to map these columns. A simple query to inspect the top of the reset list would be (illustrative example):

-- ILLUSTRATIVE example - table/column names vary by emulator
SELECT TOP 100
    Name,
    Resets,
    cLevel,
    Class
FROM Character
ORDER BY Resets DESC, cLevel DESC, Experience DESC;

Note the tiebreaker: first by resets, then by level and experience. Defining clear tiebreaker criteria avoids complaints of "why is he ahead if we have the same resets".

Collection strategy without overloading the server

The most common beginner mistake is having the site run this heavy query on every visit directly on the production table. On a busy server, this competes with the GameServer for the database and degrades everyone's performance. The correct approach is to decouple collection from display.

The recommended pattern is:

  1. Create a ranking cache table (e.g., RankingCache) that stores the already-computed result, with position, name, value and update date.
  2. A scheduled job recomputes and rewrites this table at defined intervals.
  3. The site reads only from RankingCache, with lightweight, indexed queries.

That way, the heavy query runs once per interval, not once per visitor. An illustrative skeleton of the cache table:

-- ILLUSTRATIVE example of a ranking cache table
CREATE TABLE RankingCache (
    RankType   VARCHAR(20),   -- 'reset', 'master', 'guild'
    Position   INT,
    Name       VARCHAR(50),
    Value      INT,
    ExtraInfo  VARCHAR(100),
    UpdatedAt  DATETIME
);

And the procedure that populates the reset ranking could be encapsulated in a stored procedure that clears the reset-type cache and reinserts the computed TOP.

Configuring the RankingServer or the update routines

The term "RankingServer" covers two realities. In some emulators there is a dedicated executable that reads the database and serves the data. In many cases, however, the "RankingServer" is simply the set of SQL routines + scheduled job we described. Both approaches follow the same logic: collect, compute, cache, serve.

General configuration steps:

  1. Map the columns of each metric in your database.
  2. Write the queries for each ranking (reset, master, guild), with defined tiebreakers.
  3. Create the cache table and the stored procedures that populate it.
  4. Schedule the update with the available tool.
  5. Point the site to read from the cache.
  6. Test and validate the numbers against known cases.

For the guild ranking, the logic is a bit more elaborate, since it normally sums the members' contributions. Illustrative example:

-- ILLUSTRATIVE example of a guild ranking by sum of members' resets
SELECT TOP 50
    g.G_Name AS GuildName,
    SUM(c.Resets) AS GuildScore,
    COUNT(m.Name) AS Members
FROM Guild g
JOIN GuildMember m ON g.G_Name = m.G_Name
JOIN Character   c ON m.Name  = c.Name
GROUP BY g.G_Name
ORDER BY GuildScore DESC;

Adjust the guild scoring metric to what makes sense on your server: it can be a sum of resets, Castle Siege wins, or a custom score.

Scheduling the automatic update

The update interval is a balancing decision. Too short overloads the database; too long leaves the ranking "stale" and frustrates players. An interval between 5 and 15 minutes is usually a good starting point for reset and master rankings. Guild and event rankings can update less frequently.

The scheduling options vary by environment:

  • SQL Server Agent: create a Job that runs the update stored procedure at the desired interval. It is the most integrated approach when the database is SQL Server.
  • Windows Task Scheduler: triggers a script (.sql via sqlcmd, or a .php/.bat) periodically.
  • Cron (in Linux/panel environments): schedules a script that triggers the update.

Illustrative example of a scheduled call via the command line:

:: ILLUSTRATIVE example - updates the ranking on each scheduled run
sqlcmd -S localhost -d MuOnline -U sa -P yourPassword -Q "EXEC UpdateRankingCache"

Avoid putting plain-text passwords in accessible scripts; prefer integrated authentication or protected credentials whenever possible.

Site integration

With the cache ready, the display on the site becomes a lightweight query. In PHP, the pattern is to read from RankingCache, filtering by RankType and ordering by Position. Two security precautions are mandatory:

  • Never concatenate user input directly into SQL. Use parameterized queries (prepared statements) to prevent SQL injection.
  • Use a read-only database user for the site. The site does not need to write to the production database; if it is compromised, the damage is limited.

Illustrative skeleton in PHP:

// ILLUSTRATIVE example - reading the ranking cache with PDO
$stmt = $pdo->prepare(
    "SELECT Position, Name, Value, ExtraInfo
     FROM RankingCache
     WHERE RankType = :type
     ORDER BY Position ASC"
);
$stmt->execute([':type' => 'reset']);
$ranking = $stmt->fetchAll(PDO::FETCH_ASSOC);

You can also add a cache layer on the site itself (file or memory) to reduce queries when traffic is high, respecting the same principle of decoupling collection from display.

Common errors and fixes

SymptomLikely causeFix
Outdated rankingUpdate job failed or interval too longCheck the job history and reduce the interval
Site slow when opening the rankingHeavy query running directly on productionMigrate to a cache table read by the site
Ties displayed in random orderNo tiebreaker criterionAdd a secondary ORDER BY (level, experience)
Wrong names or valuesColumn/table mapped incorrectlyReview the mapping in the emulator's database
Guild with zeroed scoreIncorrect join between guild and membersFix the member relationship in the query
Risk of intrusion via the rankingQuery concatenating user inputUse prepared statements and a read-only user

Best practices

Treat the ranking as a cheap-read system over heavy data: compute once, display many times. Keep the collection queries in versioned stored procedures, so you can review and evolve the logic without touching the site. Document your emulator's column mapping, since it is the information most often lost between migrations. Monitor the update job's execution and set up a simple alert in case it fails, so you do not find out from a player complaining. And always isolate the site's credentials with minimal permissions — the ranking is public, so it is one of the surfaces most targeted by attacks.

Launch checklist

  • Columns of each metric mapped in the emulator's database
  • Reset, master and guild queries with defined tiebreaker criteria
  • Ranking cache table created and indexed
  • Update stored procedures tested with real data
  • Job/schedule configured with an appropriate interval
  • Site reading only from the cache, with prepared statements
  • Site's database user with read-only permission
  • Validation of the numbers against known cases
  • Monitoring/alert for the update job active
  • Database backup done before creating the new objects

Frequently asked questions

What is a RankingServer in MU Online?

It is a component or service that queries the server's database, computes the player rankings (resets, master level, guilds) and makes that data available in an organized way for display on the site or in-game.

Does the ranking need to run in real time?

No, and it usually should not. Rankings are typically updated at intervals (every few minutes or hours) so as not to overload the database. Real time is only needed in specific cases and with proper caching.

Can I show the ranking directly on the site without a dedicated RankingServer?

Yes. Many servers generate the ranking with direct SQL queries from a PHP site. A dedicated RankingServer is useful for centralizing the logic, applying caching and reducing load on the main database.

Why does my ranking show outdated data?

It is usually caching. If you use an intermediate table or cache files, the update job may have failed or the interval may be too long. Check the collection routine and the schedule.

How do I keep the ranking from hurting server performance?

Use tables or views dedicated to the ranking, updated by a scheduled job, and serve the site from those tables instead of querying the production tables on every visit.

GA
Guides & builds editor

Gabriel covers gameplay, class builds, PvP and progression. He tests every strategy on a live server before publishing.

Keep reading

Related articles