Zum Hauptinhalt springen
  • Sofortiger digitaler Versand
  • Lebenslange Updates für ausgewählte Produkte
  • Vertraut von Server-Betreibern
FiveMX
Marktplatz
Komplette ServerBundlesNeuerscheinungen
FiveMX

Starte heute mit deinem Server.

Kuratierte FiveM-Ressourcen, sofortige Lieferung, kostenlose Starter-Mods und praktische Guides in einem ruhigen Marktplatz.

Shop durchsuchensupport@fivemx.com

Marktplatz

  • Marktplatz
  • FiveM Mods
  • Alle Produkte
  • Gratis-Mods
  • Beste Scripts und Mods
  • FiveM Scripts

Frameworks

  • QBCore Scripts
  • ESX Scripts
  • QBox
  • Standalone

Community

  • Blog
  • Hilfe
  • Creator
  • Partnerprogramm

Rechtliches

  • Datenschutz
  • AGB
  • Rückerstattung
  • Digitale Lieferung
  • Cookie-Richtlinie
  • DSGVO
  • DMCA
  • Impressum
  • Redaktionsrichtlinie

Server-Templates

  • QBCore-Server-Template
  • ESX-Server-Template
  • NoPixel-Server-Template
  • Server-Packs
  • Kostenlose Templates
  • Tebex-Alternative
© 2026 FiveMX. Alle Rechte vorbehalten.·FiveMX ist nicht mit Rockstar Games, Take-Two Interactive oder CFX.re verbunden. Alle Marken sind Eigentum ihrer jeweiligen Inhaber.
DiscordDocs
  1. Startseite
  2. Blog
  3. Entwicklung
Table of Contents
Einleitung: ZielgruppeTL;DR1) Vorflug-Sicherheitscheckliste2) oxmysql installieren & einbinden2.1 server.cfg3) API-Mapping: mysql‑async → oxmysqlmysql-async (Legacy):3.1 Häufige ErsetzungenEinige Frameworks stellen Wrapper bereit (z. B. ox_lib)4) Prepared-Statements-Spickzettel5) Datenbank-„UP"-Migrationsskripte (Ausführungsbereit)5.1 Charset & Collation normalisieren (UTF‑8 überall)(B) MariaDB 10.4+ — gleiche Anweisungen sind gültig.5.2 ESX-Indizes (sichere Performance-Gewinne)5.3 QBCore/QBOX-Indizes5.4 Optional: ox_inventory (falls installiert)Tabellennamen anpassen, wenn das Schema abweicht6) Rollback-Plan (Null Panik)6.1 Code-Rollback6.2 SQL-Rollback7) End-to-End-Migrationsverfahren (Skriptierbar)8) Micro-Benchmarks (Eigene Zahlen mitbringen)Ausführen9) Fehlerbehebung10) Code-Review-Checkliste (Kopieren/Einfügen)Interne LinksCredits: Gepflegt von fivemx.com

Von mysql-async zu oxmysql: Sichere Migration & Query-Muster

Veröffentlicht am 16. August 2025·von (Founder & Lead Editor)··6 Min. Lesezeit·Aktualisiert am 24. März 2026

Schritt-für-Schritt-Tutorial zur sicheren Migration von mysql-async zu oxmysql – Queries beschleunigen und SQL-Nutzung modernisieren. Vollständiger Guide für 2026.

Share
Von mysql-async zu oxmysql: Sichere Migration & Query-Muster
Von mysql-async zu oxmysql: Sichere Migration & Query-Muster

Einleitung: Zielgruppe

FiveM SQL Datenbank Migrations Guide

Zielgruppe: FiveM-Server-Besitzer, Skripter, Maintainer Ziel: mysql-async sicher durch oxmysql ersetzen, Queries beschleunigen und SQL-Nutzung modernisieren.

Dieser Guide ist Teil unseres , in dem wir ESX, QBCore und QBOX ausführlich vergleichen und dir bei der Wahl des richtigen Frameworks helfen.

Weitere Lektüre:

  • FiveM Server-Optimierung: Das definitive Playbook 2026 —
  • Adapter-Muster: ESX↔QBCore↔QBOX Exports, Events & Player Models —

TL;DR

  • oxmysql verwenden: Prepared Statements, Promise/Await-API, bessere Diagnosen, starke Performance.
  • Minimale Code-Änderungen: @param → ? (positional) oder :name (benannte) Parameter tauschen; MySQL.Async.*-Aufrufe durch MySQL.*/exports.oxmysql:* ersetzen.
  • Die SQL-„UP"-Skripte unten ausführen (Charset/Index-Korrekturen) und den Rollback bereithalten.
  • Mit dem Micro-Benchmark-Harness am Ende verifizieren, um Gewinne auf deiner Hardware zu bestätigen.

1) Vorflug-Sicherheitscheckliste

  1. Vollständiges Backup: mysqldump --single-transaction yourdb > backup.sql.
  2. Staging-Umgebung, die das Produktionsschema + Datensubset spiegelt.

Häufig gestellte Fragen

Wie migriere ich sicher von `mysql-async` zu `oxmysql`, falls unerwartete Probleme auftreten?

Der Artikel betont die Wichtigkeit eines Rollback-Plans. Konkret bedeutet das, dass du vor der Umstellung auf jeden Fall ein vollständiges Datenbank-Backup mit `mysqldump --single-transaction yourdb > backup.sql` erstellen solltest. Bewahre außerdem die alten Versionen deiner Skripte, die noch `mysql-async` verwenden, auf. Falls nach der Umstellung Probleme auftreten, kannst du so schnell zur vorherigen Konfiguration zurückkehren, indem du das Backup wiederherstellst und die älteren Skriptversionen aktivierst. Teste diesen Rollback-Prozess idealerweise vorher in deiner Staging-Umgebung, um im Ernstfall Zeit zu sparen.

Welche konkreten Änderungen muss ich in meinen Scripten vornehmen, um `oxmysql` anstelle von `mysql-async` zu nutzen?

Die Umstellung erfordert hauptsächlich Anpassungen in deinen SQL-Abfragen. Anstelle von `@param` für Parameter musst du entweder `?` für positionale Parameter oder `:name` für benannte Parameter verwenden. Außerdem musst du die `MySQL.Async.*`-Aufrufe durch `MySQL.*` oder `exports.oxmysql:*` ersetzen. Achte darauf, dass die `oxmysql`-API möglicherweise andere Rückgabewerte oder Fehlerbehandlungen hat, also überprüfe deine Skripte sorgfältig, besonders in Bezug auf Fehlerbehandlung und Datentypen.

Wie kann ich die Performance-Verbesserungen durch `oxmysql` nach der Migration auf meinem FiveM-Server überprüfen?

Der Artikel erwähnt ein Micro-Benchmark-Harness, mit dem du die Performance auf deiner spezifischen Hardware testen kannst. Dieses Harness ermöglicht es dir, verschiedene SQL-Abfragen unter realen Bedingungen zu simulieren und die Ausführungszeiten zu messen. Vergleiche die Ergebnisse vor und nach der Migration, um die tatsächlichen Performance-Gewinne durch `oxmysql` zu quantifizieren. Konzentriere dich dabei besonders auf Abfragen, die in deinen Skripten häufig verwendet werden oder bekanntermaßen langsam sind.

Table of Contents

Einleitung: ZielgruppeTL;DR1) Vorflug-Sicherheitscheckliste2) oxmysql installieren & einbinden2.1 server.cfg3) API-Mapping: mysql‑async → oxmysqlmysql-async (Legacy):3.1 Häufige ErsetzungenEinige Frameworks stellen Wrapper bereit (z. B. ox_lib)4) Prepared-Statements-Spickzettel5) Datenbank-„UP"-Migrationsskripte (Ausführungsbereit)5.1 Charset & Collation normalisieren (UTF‑8 überall)(B) MariaDB 10.4+ — gleiche Anweisungen sind gültig.5.2 ESX-Indizes (sichere Performance-Gewinne)5.3 QBCore/QBOX-Indizes5.4 Optional: ox_inventory (falls installiert)Tabellennamen anpassen, wenn das Schema abweicht6) Rollback-Plan (Null Panik)6.1 Code-Rollback6.2 SQL-Rollback7) End-to-End-Migrationsverfahren (Skriptierbar)8) Micro-Benchmarks (Eigene Zahlen mitbringen)Ausführen9) Fehlerbehebung10) Code-Review-Checkliste (Kopieren/Einfügen)Interne LinksCredits: Gepflegt von fivemx.com

Mehr zu diesem Thema

Von der Recherche zu einem produktionsreifen Server-Stack wechseln

Sobald die Richtung klar ist, kommst du über diese Angebotsseiten direkt zu verifizierten Scripts, kuratierten Bundles und framework-spezifischen Kaufpfaden.

Framework hub

Move into the QBCore landing page to compare verified scripts, framework fit, and install-ready products built for modern FiveM servers.

Open QBCore hub

Premium catalog

Move from research into the main shop to compare real products, framework labels, screenshots, and production-ready quality signals.

Open premium shop

Launch faster

Bundles shorten the path from planning to launch by grouping the highest-leverage scripts into a cleaner commercial starting point.

View bundles

Hinweis: Einige Links unten sind Affiliate-Links zu FiveMX-Produkten. Wir verdienen möglicherweise eine Provision ohne zusätzliche Kosten für dich.

Premium-Scripts, die dir gefallen könnten

Kostenlose Scripts die dich interessieren könnten

Ähnliche Artikel

Alles, was du über ox_lib wissen musst – die wichtigste Utility-Bibliothek im FiveM-Ökosystem. Behandelt Features, Installation, UI-Komponenten und das OX-Ökosystem.

February 24, 2026

Schritt-für-Schritt-Tutorial zur Bewertung von FiveM-Skripten vor dem Kauf – mit Antwortzeit unter 24h, Lizenzbedingungen und Performance-Benchmarks. Vollständiger Guide für 2026.

August 17, 2025

QBox hat sich 2026 fest als natuerlicher Nachfolger von QBCore im FiveM-Roleplay-Oekosystem etabliert.

March 31, 2026
  • Artifact & Deps: Aktuelle FXServer-Build, neuestes oxmysql.
  • Wartungsfenster für den Prod-Wechsel (normalerweise < 5 Minuten).
  • Health-Probes bereit: /players, Login-Flow, Economy-Ops, Garage-Ops, Inventory-Ops, Ban-Checks.
  • 2) oxmysql installieren & einbinden

    2.1 server.cfg

    # mysql-async deaktivieren default_prio 500 # ensure mysql-async # ← auskommentieren oder entfernen

    # oxmysql starten default_prio 50

    ```lua
    ```lua
    ensure oxmysql
    

    # Connection-String für oxmysql

    ```lua
    ```lua
    set mysql_connection_string "mysql://user:pass@127.0.0.1:3306/yourdb?charset=utf8mb4"
    

    # Optionale Diagnosen

    ```lua
    ```lua
    set mysql_slow_query_warning 200   # Queries langsamer als 200ms protokollieren
    set mysql_debug false              # true für ausführliches Logging im Staging
    

    mysql-async während der Staging-Phase deaktiviert aber im resources-Ordner verfügbar lassen (für schnellen Rollback).

    3) API-Mapping: mysql‑async → oxmysql

    mysql-async (Legacy):

    mysql-async (Legacy):

    • Async: MySQL.Async.fetchAll, MySQL.Async.fetchScalar, MySQL.Async.execute
    • Sync: MySQL.Sync.fetchAll, MySQL.Sync.fetchScalar, MySQL.Sync.execute
    • Parameter: @param-Style-Tabellen wie { ['@identifier']=identifier }

    oxmysql (modern):

    • Callback-Style via Export: exports.oxmysql:query|scalar|single|insert|update(sql, params, cb)
    • Promise/Await via Global: MySQL.query|scalar|single|insert|update.await(sql, params) und Nicht-Await-Callbacks ohne .await
    • Parameter: positional ? via Array, oder benannt :name via Objekt

    3.1 Häufige Ersetzungen

    SELECT viele

    ```lua
    ```lua
    -- mysql-async
    MySQL.Async.fetchAll(
      'SELECT * FROM users WHERE identifier = @id',
      { ['@id'] = identifier },
      function(rows) ... end
    )
    
    -- oxmysql (Callback via Export)
    exports.oxmysql:query(
      'SELECT * FROM users WHERE identifier = ?',
      { identifier },
      function(rows) ... end
    )
    
    -- oxmysql (await)
    local rows = MySQL.query.await(
      'SELECT * FROM users WHERE identifier = ?',
      { identifier }
    )
    

    SELECT einzelne Zeile

    ```lua
    ```lua
    -- mysql-async (fetchAll + rows[1])
    
    -- oxmysql
    local row = MySQL.single.await(
      'SELECT * FROM users WHERE identifier = ?',
      { identifier }
    )
    

    SELECT scalar (z. B. count, id)

    ```lua
    ```lua
    -- mysql-async
    
    -- oxmysql
    local count = MySQL.scalar.await(
      'SELECT COUNT(*) FROM owned_vehicles WHERE owner = ?',
      { owner }
    )
    

    INSERT (insertId erhalten)

    ```lua
    ```lua
    -- mysql-async (execute)
    
    -- oxmysql
    local insertId = MySQL.insert.await(
      'INSERT INTO notes (owner, text) VALUES (?, ?)',
      { cid, text }
    )
    

    UPDATE/DELETE (affectedRows)

    ```lua
    ```lua
    -- mysql-async (execute)
    
    -- oxmysql
    local changed = MySQL.update.await(
      'UPDATE users SET job = ?, job_grade = ? WHERE identifier = ?',
      { job, grade, identifier }
    )
    

    Transaktionen (manuell)

    ```lua
    ```lua
    -- oxmysql manuelle Transaktion
    MySQL.query.await('START TRANSACTION')
    local ok = true
    
    local r1 = MySQL.update.await('UPDATE users SET bank = bank - ? WHERE identifier = ? AND bank >= ?', { amount, fromId, amount })
    local r2 = MySQL.update.await('UPDATE users SET bank = bank + ? WHERE identifier = ?', { amount, toId })
    
    if r1 == 1 and r2 == 1 then
      MySQL.query.await('COMMIT')
    else
      MySQL.query.await('ROLLBACK')
    end
    

    Einige Frameworks stellen Wrapper bereit (z. B. ox_lib)

    Einige Frameworks stellen Wrapper bereit (z. B. ox_lib), die MySQL.ready, .transaction usw. hinzufügen. Die obigen Aufrufe sind ohne zusätzliche Wrapper sicher.

    4) Prepared-Statements-Spickzettel

    Param-Stile

    • mysql‑async (Legacy): @name-Platzhalter mit einer Tabelle: { ['@name']=value }
    • oxmysql (positional): ?-Platzhalter mit einem Array: { value1, value2 }
    • oxmysql (benannt): :name-Platzhalter mit einem Objekt: { name = value }

    Beispiele

    ```lua
    ```lua
    -- Benannte Parameter (empfohlen für Lesbarkeit)
    local row = MySQL.single.await(
      'SELECT * FROM users WHERE identifier = :id',
      { id = identifier }
    )
    
    -- IN (...) Liste
    -- Platzhalter dynamisch aufbauen und ein flaches Array übergeben
    local ids = { 'cid1','cid2','cid3' }
    local qs = ('?,' ):rep(#ids):sub(1,-2) -- "?, ?, ?"
    local rows = MySQL.query.await('SELECT * FROM players WHERE citizenid IN ('..qs..')', ids)
    
    -- JSON-Felder (MySQL 5.7+/MariaDB 10.2+)
    local name = MySQL.scalar.await('SELECT JSON_UNQUOTE(JSON_EXTRACT(data, "$.name")) FROM players WHERE citizenid = ?', { cid })
    

    Tun

    • Prepared Statements überall verwenden (niemals Benutzereingaben per String-Verkettung einbauen).
    • Benannte Parameter für Klarheit bei komplexen Statements bevorzugen.
    • LIMIT 1 hinzufügen, wenn eine einzelne Entität gelesen wird.

    Vermeiden

    • Wildcard SELECT * in Hot Paths (nur benötigte Spalten projizieren).
    • N+1-Queries pro Zeile; mit IN (...) batchen.

    5) Datenbank-„UP"-Migrationsskripte (Ausführungsbereit)

    Die Blöcke wählen, die zum Framework (ESX/QBCore) und Server (MySQL 8+ oder MariaDB 10.4+) passen. Zuerst im Staging ausführen.

    5.1 Charset & Collation normalisieren (UTF‑8 überall)

    (A) MySQL 8+ — yourdb einmalig ersetzen

    ```sql
    ```sql
    -- Datenbank-Standard auf utf8mb4 setzen (Emoji-sicher)
    ALTER DATABASE \`yourdb\` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    
    -- Gängige Tabellen konvertieren (Liste bei Bedarf erweitern)
    ALTER TABLE \`users\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE \`owned_vehicles\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE \`players\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE \`player_vehicles\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

    (B) MariaDB 10.4+ — gleiche Anweisungen sind gültig.

    (B) MariaDB 10.4+ — gleiche Anweisungen sind gültig.

    Weitere Hot-Tabellen (Inventory, Billing, Phone, Society, Jobs) nach Vorhandensein auf dem Server hinzufügen.

    5.2 ESX-Indizes (sichere Performance-Gewinne)

    MySQL 8+

    ```sql
    ```sql
    ALTER TABLE \`users\`
    

    ADD INDEX IF NOT EXISTS `idx_users_identifier` (`identifier`), ADD INDEX IF NOT EXISTS `idx_users_job` (`job`), ADD INDEX IF NOT EXISTS `idx_users_name` (`name`);

    ```sql
    ```sql
    ALTER TABLE \`owned_vehicles\`
    

    ADD UNIQUE INDEX IF NOT EXISTS `ux_owned_vehicles_plate` (`plate`), ADD INDEX IF NOT EXISTS `idx_owned_vehicles_owner` (`owner`);

    MariaDB 10.4+

    ```lua
    ```lua
    -- Zuerst löschen für Idempotenz, wo IF NOT EXISTS nicht verfügbar ist
    DROP INDEX IF EXISTS \`idx_users_identifier\` ON \`users\`;
    DROP INDEX IF EXISTS \`idx_users_job\` ON \`users\`;
    DROP INDEX IF EXISTS \`idx_users_name\` ON \`users\`;
    CREATE INDEX \`idx_users_identifier\` ON \`users\` (\`identifier\`);
    CREATE INDEX \`idx_users_job\` ON \`users\` (\`job\`);
    CREATE INDEX \`idx_users_name\` ON \`users\` (\`name\`);
    
    DROP INDEX IF EXISTS \`ux_owned_vehicles_plate\` ON \`owned_vehicles\`;
    DROP INDEX IF EXISTS \`idx_owned_vehicles_owner\` ON \`owned_vehicles\`;
    CREATE UNIQUE INDEX \`ux_owned_vehicles_plate\` ON \`owned_vehicles\` (\`plate\`);
    CREATE INDEX \`idx_owned_vehicles_owner\` ON \`owned_vehicles\` (\`owner\`);
    

    5.3 QBCore/QBOX-Indizes

    MySQL 8+

    ```sql
    ```sql
    ALTER TABLE \`players\`
    

    ADD UNIQUE INDEX IF NOT EXISTS `ux_players_citizenid` (`citizenid`), ADD INDEX IF NOT EXISTS `idx_players_license` (`license`), ADD INDEX IF NOT EXISTS `idx_players_steam` (`steam`), ADD INDEX IF NOT EXISTS `idx_players_last_name` (`lastname`);

    ```sql
    ```sql
    ALTER TABLE \`player_vehicles\`
    

    ADD UNIQUE INDEX IF NOT EXISTS `ux_player_vehicles_plate` (`plate`), ADD INDEX IF NOT EXISTS `idx_player_vehicles_citizenid` (`citizenid`);

    MariaDB 10.4+

    ```lua
    ```lua
    DROP INDEX IF EXISTS \`ux_players_citizenid\` ON \`players\`;
    DROP INDEX IF EXISTS \`idx_players_license\` ON \`players\`;
    DROP INDEX IF EXISTS \`idx_players_steam\` ON \`players\`;
    DROP INDEX IF EXISTS \`idx_players_last_name\` ON \`players\`;
    CREATE UNIQUE INDEX \`ux_players_citizenid\` ON \`players\` (\`citizenid\`);
    CREATE INDEX \`idx_players_license\` ON \`players\` (\`license\`);
    CREATE INDEX \`idx_players_steam\` ON \`players\` (\`steam\`);
    CREATE INDEX \`idx_players_last_name\` ON \`players\` (\`lastname\`);
    
    DROP INDEX IF EXISTS \`ux_player_vehicles_plate\` ON \`player_vehicles\`;
    DROP INDEX IF EXISTS \`idx_player_vehicles_citizenid\` ON \`player_vehicles\`;
    CREATE UNIQUE INDEX \`ux_player_vehicles_plate\` ON \`player_vehicles\` (\`plate\`);
    CREATE INDEX \`idx_player_vehicles_citizenid\` ON \`player_vehicles\` (\`citizenid\`);
    

    5.4 Optional: ox_inventory (falls installiert)

    ```sql
    ```sql
    ALTER TABLE \`ox_inventory\`
    

    ADD INDEX IF NOT EXISTS `idx_inv_owner` (`owner`), ADD INDEX IF NOT EXISTS `idx_inv_type` (`type`);

    ```sql
    ```sql
    ALTER TABLE \`ox_inventory_items\`
    

    ADD INDEX IF NOT EXISTS `idx_items_inv_owner_name` (`inventory`, `owner`, `name`);

    Tabellennamen anpassen, wenn das Schema abweicht

    Tabellennamen anpassen, wenn das Schema abweicht (manche Setups verwenden inventories / items).

    6) Rollback-Plan (Null Panik)

    6.1 Code-Rollback

    1. Ressource-Änderungen rückgängig machen (einen legacy-mysql-async-Branch bereithalten).
    2. In server.cfg tauschen: # ensure oxmysql ensure mysql-async
    3. FXServer oder betroffene Ressourcen in Abhängigkeitsreihenfolge neu starten.

    6.2 SQL-Rollback

    • Wenn nur Indizes hinzugefügt wurden: diese löschen (siehe die MariaDB-Blöcke oben — DROP INDEX IF EXISTS verwenden).
    • Wenn Charset/Collation geändert wurde und rückgängig gemacht werden muss, DB und Tabellen zurücksetzen:
    ```sql
    ```sql
    ALTER DATABASE \`yourdb\` CHARACTER SET = utf8 COLLATE = utf8_general_ci;
    ALTER TABLE \`users\` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    ALTER TABLE \`owned_vehicles\` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    ALTER TABLE \`players\` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    ALTER TABLE \`player_vehicles\` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    Wenn möglich aus backup.sql wiederherstellen, anstatt massenhafte Charset-Rücksetzungen vorzunehmen.

    7) End-to-End-Migrationsverfahren (Skriptierbar)

    1. Deploys einfrieren, DB sichern.
    2. Abschnitt 5 „UP"-SQL im Staging anwenden → verifizieren → Prod.
    3. Code-Refactoring committen: Aufrufe ersetzen (Abschnitt 3) + Parameterstile (Abschnitt 4).
    4. Deployen, ensure oxmysql, Server neu starten.
    5. Smoke-Tests ausführen (Login, Gehaltsschecks, Inventory, Fahrzeug spawn/despawn, Bans, Society-Geld, Job-Duty-Toggles).
    6. Protokolle 15–30 Minuten überwachen (mysql_slow_query_warning hilft); verpasste Parameter oder Schema-Diskrepanzen beheben.

    8) Micro-Benchmarks (Eigene Zahlen mitbringen)

    Eine kleine Ressource, die du einfügen kannst, um Hot-Path-Queries auf deiner Hardware und deinem Datensatz zu vergleichen.

    fxmanifest.lua

    fx_version 'cerulean'

    ```lua
    ```lua
    game 'gta5'
    

    server_script 'bench.lua'

    bench.lua

    ```lua
    ```lua
    local COUNT = 2000  -- für deinen Server anpassen
    
    local function bench(name, fn)
      local t0 = os.clock()
      local ok, err = pcall(fn)
      local dt = (os.clock() - t0) * 1000.0
    

    print(('[bench] %s: %.2f ms %s'):format(name, dt, ok and '' or ('ERR: '..tostring(err))))

    ```lua
    ```lua
    end
    
    -- Hot Path 1: Eigentümer-Lookup
    bench('SELECT single', function()
      for i=1,COUNT do
        local row = MySQL.single.await('SELECT owner FROM owned_vehicles WHERE plate = :p LIMIT 1', { p = ('TEST%04d'):format(i % 500) })
      end
    end)
    
    -- Hot Path 2: Batch-Fetch
    bench('SELECT batch IN', function()
      local ids = {}
      for i=1,100 do ids[#ids+1] = ('cid%04d'):format(i) end
      local qs = ('?,' ):rep(#ids):sub(1,-2)
      local rows = MySQL.query.await('SELECT citizenid, firstname, lastname FROM players WHERE citizenid IN ('..qs..')', ids)
    end)
    
    -- Hot Path 3: Update mit Guard
    bench('UPDATE guarded', function()
      for i=1,COUNT do
        local changed = MySQL.update.await('UPDATE users SET bank = bank + :d WHERE identifier = :id AND bank >= 0', { d = 1, id = ('lic:%04d'):format(i % 500) })
      end
    end)
    

    Ausführen

    Ausführen

    1. Die Ressource in einen Ordner legen (z. B. ox-bench/), ensure ox-bench zur server.cfg hinzufügen.
    2. Server-Konsole beobachten; Ergebnisse werden als Zeilen ausgegeben wie: [bench] SELECT single: 134.21 ms.
    3. Für einen Vorher/Nachher-Vergleich einmal mit mysql-async ausführen (Aufrufe ggf. anpassen), dann mit oxmysql.

    Worauf zu achten ist

    • Niedrigere Gesamt-ms pro Abschnitt nach der Migration.
    • Niedrigere P95/P99-Latenz bei Gameplay-Aktionen, die an Queries gebunden sind.
    • Weniger Slow-Query-Warnungen über eine Stunde Live-Play.

    9) Fehlerbehebung

    F: Ich erhalte „no such export: query/single/…". A: oxmysql startet nicht früh genug. Sicherstellen, dass ensure oxmysql über den Ressourcen steht, die es verwenden.

    F: Parameter-Fehler oder leere Ergebnisse. A: Wahrscheinlich wurden @param-Platzhalter beibehalten. Durch ? oder :name ersetzen und entsprechend ein Array/Objekt übergeben.

    F: Deadlocks oder partielle Schreibvorgänge. A: Mehrstufige Geldbeträge/Transfers in einer Transaktion einwickeln (siehe Abschnitt 3), Indizes aus Abschnitt 5 hinzufügen.

    F: JSON-Pfad gibt NULL zurück. A: Prüfen, ob die Engine JSON-Funktionen unterstützt (MySQL ≥5.7/MariaDB ≥10.2) und ob der Spaltentyp JSON ist (nicht LONGTEXT).

    F: Nach der Migration langsamer. A: Fehlende Indizes prüfen, Query mit EXPLAIN analysieren, nur benötigte Spalten projizieren und das Server-Optimierungs-Playbook prüfen.

    10) Code-Review-Checkliste (Kopieren/Einfügen)

    • Kein per String-Verkettung erstelltes SQL; alle Queries parametrisiert.
    • .single/.scalar mit LIMIT 1 verwenden, wenn nur eine Zeile/ein Wert benötigt wird.
    • IN (...)-Reads für Kollektionen batchen.
    • Transaktionen um mehrstufige Geld-/Inventory-Ops herum.
    • Index vorhanden für jede heiße WHERE/JOIN-Spalte.
    • SELECT * in Hot Paths vermeiden.
    • Slow Queries protokollieren; wöchentlich die Top-Übeltäter verfolgen.

    Interne Links

    • FiveM Server-Optimierung: Das definitive Playbook 2026 — https://fivemx.com/blog/how-to-optimize-fivem-server-performance
    • Adapter-Muster: ESX↔QBCore↔QBOX Exports, Events & Player Models — https://fivemx.com/blog/adapter-patterns

    Credits: Gepflegt von fivemx.com

    Credits Gepflegt von fivemx.com. Beiträge willkommen (Diffs zusätzlicher sicherer Indizes oder Wrapper-Helfer einsenden).

    Was sind die SQL "UP"-Skripte und warum sollte ich sie ausführen, wenn ich zu `oxmysql` migriere?

    Die SQL "UP"-Skripte enthalten Änderungen an deiner Datenbankstruktur, die empfohlen werden, um `oxmysql` optimal zu nutzen. Dazu gehören typischerweise Anpassungen des Zeichensatzes (Charset) und die Optimierung von Indizes. Diese Änderungen können die Performance verbessern und potenzielle Kompatibilitätsprobleme mit `oxmysql` verhindern. Es ist wichtig, diese Skripte vor der eigentlichen Migration auszuführen, da sie möglicherweise nicht abwärtskompatibel sind und Änderungen an der Datenbankstruktur vornehmen, die das alte `mysql-async` nicht unterstützt.

    Wie funktioniert Von mysql-async zu oxmysql: Sichere Migration & Query-Muster?

    Zielgruppe: FiveM-Server-Besitzer, Skripter, Maintainer Ziel: mysql-async sicher durch oxmysql ersetzen, Queries beschleunigen und SQL-Nutzung modernisieren.

    Wie funktioniert Von mysql-async zu oxmysql: Sichere Migration & Query-Muster?

    Zielgruppe: FiveM-Server-Besitzer, Skripter, Maintainer Ziel: mysql-async sicher durch oxmysql ersetzen, Queries beschleunigen und SQL-Nutzung modernisieren.

    Was kostet Von mysql-async zu oxmysql: Sichere Migration & Query-Muster?

    Zielgruppe: FiveM-Server-Besitzer, Skripter, Maintainer Ziel: mysql-async sicher durch oxmysql ersetzen, Queries beschleunigen und SQL-Nutzung modernisieren.

    Lars Miller
    Profil
    Entwicklung
    von mysql-async zu oxmysql sichere migration
    vollständigen FiveM-Frameworks-Guides
    https://fivemx.com/blog/how-to-optimize-fivem-server-performance
    https://fivemx.com/blog/adapter-patterns
    Vorheriger Artikel

    Adapter-Patterns: ESX, QBCore & QBOX (Exports, Events & APIs)

    Nächster Artikel

    Vor-dem-Kauf-Checkliste: Warnsignale, Lizenzbedingungen & Benchmarks

    So migrierst du ESX → QBCore richtig
    Die Geschichte von FiveM: Vom Mod-Projekt zur offiziellen Plattform
    Inventar & Gewicht optimieren: Von items.lua bis Metadaten
    FiveM Server Backup-Strategien: Automatisierte MySQL und Ressourcen
    txAdmin von Grund auf einrichten (2026 Guide)
    Browse QBCore-ready scripts
    Browse premium FiveM scripts
    Compare curated bundles
    50x HQ CHROMIUM Weapon Pack

    50x HQ CHROMIUM Weapon Pack

    50,60 €
    ADS Police Script

    ADS Police Script

    11,34 €
    Pierce Tires / Knife Tires — Slash Tires Script

    Pierce Tires / Knife Tires — Slash Tires Script

    4,79 €
    l2s-dispatch

    l2s-dispatch

    28,79 €
    Gameconfig for Legacy & Enhanced

    Gameconfig for Legacy & Enhanced

    8,243,364 Downloads
    PC Trainer V

    PC Trainer V

    1,272,946 Downloads
    LemonUI: Open Source UI Library

    LemonUI: Open Source UI Library

    1,138,096 Downloads
    NFS gauge - RPM Gear Speedometer & Timer

    NFS gauge - RPM Gear Speedometer & Timer

    1,058,515 Downloads
    ox_lib Komplett-Guide: Die unverzichtbare FiveM-Utility-Bibliothek
    ox_lib Komplett-Guide: Die unverzichtbare FiveM-Utility-Bibliothek
    Vor-dem-Kauf-Checkliste: Warnsignale, Lizenzbedingungen & Benchmarks
    Vor-dem-Kauf-Checkliste: Warnsignale, Lizenzbedingungen & Benchmarks
    QBox Framework Guide: Von QBCore migrieren und Performance steigern (2026)
    QBox Framework Guide: Von QBCore migrieren und Performance steigern (2026)

    Keine Zeit, alles selbst zu konfigurieren?

    Starte mit einem vorgefertigten, getesteten FiveM Server-Pack. Framework-optimiert, alle Scripts vorinstalliert.

    Super ESX Server
    esxstandalone

    Super ESX Server

    The Super ESX Server is one of the best FiveM server templates - over 1.000 purchases! Want to know why we call it our Super Server? Check out our video to find out some of the basics details of the world. Update 10 is included, make sure to install v7 first and then use content of v10 yo

    $228.32
    ESX Server Base (by RibSosay)
    esxstandalone

    ESX Server Base (by RibSosay)

    Prebuilt FiveM server with ESX framework GUARANTEE : We offer a guarantee ensuring compatibility with your setup.

    $53.99
    Alle Server-Packs ansehen