0

Я новичок в Mysql, и у меня возникают проблемы при чтении больших таблиц базы данных. Я создал следующую базу данных:База данных MySql медленная реакция с несколькими большими таблицами

CREATE DATABASE `chamber_master_db` /*!40100 DEFAULT CHARACTER SET utf8 */ 

с 80 таблицами, как показано ниже:

CREATE TABLE `chamber_el_801_server_tb` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `Chamber_id` varchar(20) NOT NULL DEFAULT 'NA', 
    `Date` date NOT NULL, 
    `Time` varchar(20) NOT NULL DEFAULT 'NA', 
    `Status` varchar(20) NOT NULL DEFAULT 'NA', 
    `EWR` varchar(20) NOT NULL DEFAULT 'NA', 
    `Program` varchar(30) NOT NULL DEFAULT 'NA', 
    `TestLeg` varchar(20) NOT NULL DEFAULT 'NA', 
    `Test` varchar(20) NOT NULL DEFAULT 'NA', 
    `Temperature` double NOT NULL DEFAULT '0', 
    `Humidity` double NOT NULL DEFAULT '0', 
    `Channel3` double NOT NULL DEFAULT '0', 
    `Setpoint1` double NOT NULL DEFAULT '0', 
    `Setpoint2` double NOT NULL DEFAULT '0', 
    `Setpoint3` double NOT NULL DEFAULT '0', 
    `ChamberStatus` int(11) NOT NULL DEFAULT '0', 
    `TestEquipment` varchar(20) NOT NULL DEFAULT 'NA', 
    `LoadRack` varchar(20) NOT NULL DEFAULT 'NA', 
    PRIMARY KEY (`id`), 
    KEY `index2` (`Date`) 
) ENGINE=InnoDB AUTO_INCREMENT=44754 DEFAULT CHARSET=utf8 

У меня есть два индекса, один для «ид», которая является последовательным ввод номера из записи, а другая - для даты, так как я буду запрашивать таблицу по дате (я помещаю эти индексы, потому что читаю, что использование индексов может ускорить процесс запроса).

80 таблиц базы данных получают новую запись каждую минуту, поэтому через несколько недель таблицы очень большие.

Когда я запрашиваю набор записей за период времени одной таблицы, ответ базы данных выполняется быстро. Проблема заключается в том, что я запрашиваю набор записей за период времени всех таблиц в базе данных (этот запрос предназначен для целей статистики для моего веб-приложения), даже если выполняется запрос из workbench 5.2.46 mysql, где база данных запущена.

Я также прочитал, что двигатель, используемый базой данных, может повлиять на базу данных, но я не уверен, что может быть лучшим для этого приложения.

Запрос я использую следующий:

commandLine = "SELECT count(*) FROM " + table + " WHERE Status = '" + "Run" + "' AND Date BETWEEN '" + startdate + "' AND '" + enddate + "'"; 
_mysqlcommand.CommandText = commandLine; 
Run= Convert.ToDouble(_mysqlcommand.ExecuteScalar())/totalrows * 100; 

Этот запрос выполняется в 5 раз для каждой таблицы, чтобы знать количество строк для различных состояния и затем это повторяется внутри цикла для 80 таблиц в базе данных, и это то, что требуется до одной минуты.

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

+0

Возможно, вы захотите добавить индекс в поле 'Status', а затем снова выполнить измерение. – Bjoern

ответ

1

Для запроса, который вы используете, у вас должен быть составной индекс в Status + Date. Часть вашей проблемы заключается в том, что, поскольку статус не является частью вашего индекса, ему необходимо выполнить полное сканирование таблицы, чтобы отфильтровать статус. Дайте ему выстрел и посмотрите, работает ли он лучше.

Смежные вопросы