База данных MySQL очень медленная, с очень большой таблицей [закрыто]

У меня есть таблица MySQL со 150 миллионами строк. Ниже представлена ​​его структура данных.

enter image description here

Ниже приведены некоторые из его данных.

enter image description here

Теперь, используя PHP My Admin, я выполнил следующую команду.

SELECT `iwords` FROM `wordstable` WHERE `iwebs` = "a1" 

В нем говорится, что на выполнение запроса ушло меньше секунды. Ниже приводится доказательство.

enter image description here

Но на самом деле мне потребовалось около 1 минуты, чтобы отобразить данные !!

Я запустил Java-код, чтобы узнать время. Это ниже.

public void select(String str) 
{
    try {
        long startTime = System.currentTimeMillis();
        Statement s = con.createStatement();
        ResultSet executeQuery = s.executeQuery("SELECT `iwords` FROM `wordstable` WHERE `iwebs` = \"a1\" ");
        int r=0;
        long endTime = System.currentTimeMillis();
        System.out.println("Time took by Database: "+(endTime-startTime));

        while(executeQuery.next())
        {
            r++;
        }


        System.out.println("Number of rows: "+String.valueOf(r));

    } catch (SQLException ex) {
       ex.printStackTrace();
    }

}

Этот код напечатал время как 88779 миллисекунд, что составляет 88,779 секунды!

Это очень большая проблема, у меня есть массив слов для поиска, и если поиск «единственного» слова занимает 88 секунд, это будет бесполезно!

Ниже приведены некоторые подробности моей таблицы высокого уровня.

enter image description here

Ниже приведены подробные сведения о сервере.

enter image description here

У меня вопрос: действительно ли MySQL выполняет эту работу? Согласно MySQL, для обработки запроса потребовалось меньше секунды, но почему на самом деле это занимает столько времени? Моя будущая база данных будет больше, чем эта, миллиарды записей. Мне нужно выполнить эту операцию как минимум за 2-3 секунды!

update

По запросу члена SO я выполнил следующую команду и публикую их результаты.

Вход EXPLAIN SELECT iwords FROM wordstable WHERE iwebs = 'a1';

Результат enter image description here

Вход

SET profiling=1;
SELECT iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;

Выход

enter image description here

Наконец, я получаю доступ к этому серверу с помощью удаленного рабочего стола, но весь код и все работало внутри сервера.

1
задан 24 April 2014 в 14:34
2 ответа

Есть ли у вас какие-либо индексы для этой таблицы?

Пожалуйста, опубликуйте вывод:

EXPLAIN SELECT iwords FROM wordstable WHERE iwebs = 'a1';

Затем опубликуйте вывод следующего набора команд:

SET profiling=1;
SELECT iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;

Это скажет вам, где MySQL зависает, и тогда вы, по крайней мере, будете знать, с чего начать.

ОБНОВЛЕНИЕ:

После просмотра вашего обновленного вопроса я не знаю, почему MySQL не может найти подходящий ключ для выполнения вашего запроса. Насколько обширен набор ценностей, который может содержать iwebs? Ваши длительности явно взяты из кеша. Вам следует сбросить кеш запросов MySQL через

RESET QUERY CACHE;

, если у вас есть права на перезагрузку, иначе вы должны использовать

FLUSH QUERY CACHE;

. Если вы не можете выполнить эту команду, вам придется перезапустить экземпляр сервера MySQL.

Повторно запустите ваши команды. с флагом SQL_NO_CACHE, как сказал Небу, чтобы убедиться, что он не мешает.

Итак:

EXPLAIN SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';
SET profiling=1;
SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;
4
ответ дан 3 December 2019 в 17:07

Думаю, запрос кэшируется. Попробуйте

SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';

Это даст лучшее представление о том, сколько времени требуется для выполнения запроса. Также убедитесь, что веб-сайты проиндексированы. И последнее, чтобы действительно ускорить ваши запросы, сохраните таблицу в памяти:

CREATE TABLE ii_table (....) ENGINE = MEMORY DEFAULT CHARSET = utf8

Хранение таблицы в памяти имеет некоторые последствия. Например, каждый раз, когда сервер mysql останавливается, информация таблицы исчезает. Лично для таких ситуаций я создаю две таблицы. Одна таблица памяти, в которой выполняются запросы, и одна таблица на диске. Когда mysql запускается, он загружает таблицу дисков в память.

1
ответ дан 3 December 2019 в 17:07

Теги

Похожие вопросы