2014-01-18 4 views
3

Фоновая: У меня есть 8 миллионов записей, и я хочу, чтобы ускорить время запроса, это мой столMYSQL Partition избежать полного сканирования таблицы

CREATE TABLE vehiclelog3 (
    ID INT(100) NOT NULL AUTO_INCREMENT, 

`PNumber` VARCHAR(30) DEFAULT NULL, 

    `Date` DATE DEFAULT NULL, 

    `Time` TIME DEFAULT NULL, 

    `Offset` VARCHAR(45) DEFAULT NULL, 

    `Street1` VARCHAR(60) DEFAULT NULL, 

    `Street2` VARCHAR(60) DEFAULT NULL, 

`City` VARCHAR(60) DEFAULT NULL, 

    `Region` VARCHAR(60) DEFAULT NULL, 
ect... 

    PRIMARY KEY (`ID`,`Date`), 
    UNIQUE KEY ID (`ID`,`Date`), 
    KEY date (`Date`), 
    KEY plate (`PNumber`) 
) ENGINE=INNODB 
PARTITION BY HASH(MONTH(`Date`)) 
    PARTITIONS 12; 

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

EXPLAIN PARTITIONS Select * from vehiclelog3 where PNumber = "bla" and Date = "2014-01-18" 

выход:

1 SIMPLE  vehiclelog3 p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 index (NULL)   PRIMARY 7  (NULL) 3346217 Using where 

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

+0

Я использовал ваши 'create' и' select', и запрос касался только одного раздела, как и предполагалось. Не могли бы вы опубликовать не усеченную версию запроса на создание и реальный запрос выбора (в вашем элементе есть столбец 'plate', который является ключом, а не столбцом в создании)? –

+0

О! Извините за это, я редактирую табличку в PNumber в запросе Select. – zero

ответ

1

SELECT * FROM tableNmae PARTITION (partitionName); как взято из http://dev.mysql.com/doc/refman/5.6/en/partitioning-selection.html может использоваться для ограничения SELECT только на один раздел. Так как вы знаете взаимосвязь между разделом и датой, которую вы используете, это тривиально.

+0

Я пробовал это «ВЫБЕРИТЕ * ОТ автомобиля log3 PARTITION (p1); но я получил ошибку этой ошибки в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '(p1) LIMIT 0, 1000' по строке 11' – zero

+0

Да, извините. Это функция, введенная в MySQL 5.6, если вы используете более старую версию, этот запрос не удастся. Итак, это приводит к вопросу: можете ли вы обновить свою MySQL-версию? – Peter

+0

awts ok плохо попробуйте связаться с нашим администратором веб-сервера базы данных, если они могут обновить там mysql. спасибо Петру – zero

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