Das Zählen zeigt das variable Ergebnis in MySQL

7

Ich lese diesen Artikel und es scheint keine Möglichkeit zu geben, so etwas zu tun:

SELECT COUNT(*) 
WHERE SHOW VARIABLES 
WHERE Variable_name = 'innodb_ft_cache_size'

Ich kann das Folgende tun, aber dies funktioniert nicht in MySQL 5.7 (Keine Variablen in Tabelle)

SELECT COUNT(*) 
FROM information_schema.GLOBAL_VARIABLES 
WHERE Variable_name = 'innodb_ft_cache_size' (always returns 0)

Der Grund, warum ich dies tun muss, besteht darin, in einer gespeicherten Prozedur zu erkennen, ob sie die Möglichkeit haben, Volltext zu erstellen. Es muss in MySQLund Varianten von MySQL funktionieren, damit ich nicht einfach analysieren kann@@verison.

Gibt es einen anderen Weg, dies zu tun?

Hier ist eine gespeicherte Prozedur, works on 5.5,5.6, and 5.7mit der das Vorhandensein von Volltextfähigkeiten erkannt werden kann. Dies sollte auch bei MySQL-Varianten funktionieren

begin
set @supports_ft = 0;
set @information_schema_exists := (SELECT COUNT(SCHEMA_NAME) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'information_schema');

if @information_schema_exists > 0 then
    set @information_schema_exists_global_vars_exists := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'information_schema' AND TABLE_NAME = 'GLOBAL_VARIABLES');
        if @information_schema_exists_global_vars_exists > 0 then
            set @supports_ft := (SELECT COUNT(*) FROM information_schema.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'innodb_ft_cache_size');
        end if;
end if;

if @supports_ft = 0 then
    set @performance_schema_exists := (SELECT COUNT(SCHEMA_NAME) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'performance_schema');
    if @performance_schema_exists > 0 then
        set @performance_schema_exists_global_vars_exists := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'GLOBAL_VARIABLES');
            if @performance_schema_exists_global_vars_exists > 0 then
                set @supports_ft := (SELECT COUNT(*) FROM performance_schema.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'innodb_ft_cache_size');
            end if;
    end if;
end if;
Chris Muench
quelle
Dies funktioniert in MySQL 5.7 für Nicht-Root-Benutzer nicht, da auf das Leistungsschema nicht zugegriffen werden kann. Gibt es eine Möglichkeit, @@ innodb_ft_cache_size auszuwählen, ohne einen schwerwiegenden Fehler in MySQL 5.5 zu verursachen?
Chris Muench
Erstellen Sie die gespeicherte Routine "SQL SECURITY DEFINER" und erstellen Sie sie, während Sie "root" sind. Dann sollten Sie Zugriff haben.
Rick James

Antworten:

1

Du kannst rennen

flush status;
show global variables like 'innodb_ft_cache_size';
show status like 'handler_read_rnd_next';

Wenn es 2 ist (oder um 2 erhöht wird), haben Sie die Variable. Wenn es 1 ist (oder um 1 erhöht wird), tun Sie dies nicht.

Das sollte bei jeder Version funktionieren.

Károly Nagy
quelle
0

Ihre Abfrage gegen information_schema.GLOBAL_VARIABLESfunktioniert nicht, da sie unter MySQL 5.7 standardmäßig deaktiviert ist. Sie müssen zuerst die 5.6-Kompatibilitätsfunktion aktivieren (kein Neustart erforderlich).

set global show_compatibility_56=1;
Socaire
quelle
Funktioniert dies in späteren Versionen (wie 8.0) und Varianten?
RDFozz
Nein, diese Einstellung wurde in 8.0.1 von MySQL entfernt. Wie für Varianten, es
Socaire
Percona Server hat es für Varianten, aber MariaDB scheint es auf keiner Version zu haben
socaire