2017-01-17 3 views
1

У нас есть таблица MySQL (table_ha), как этот:разделов таблицы в MySQL

Name = table_ha 
+----------+------------------+ 
| hash_loc |  hash_val  | 
+----------+------------------+ 
| 242342 | 9606075000001005 | 
+----------+------------------+ 
| 431231 | 9606075000005208 | 
+----------+------------------+ 
| 342344 | 7645345456745536 | 
+----------+------------------+ 
| 324254 | 7656453453465788 | 
+----------+------------------+ 
| 656456 | 9788674534546766 | 
+----------+------------------+ 
| 674453 | 3458752778456834 | 
+----------+------------------+ 
| ... |  ...  | 
+----------+------------------+ 
| 765874 | 8796634586346785 | 
+----------+------------------+ 
| 864534 | 9834667054534588 | 
+----------+------------------+ 

Мы постоянно выполнять запросы, как следующий:

SELECT * FROM table_ha (SELECT 1 AS hash_loc UNION ALL SELECT 28700 UNION ALL SELECT 28728 ... UNION ALL SELECT 28680 UNION ALL SELECT 28694) AS T1 ON table_ha.hash_loc = T1.hash_loc' 

Мы должны предположить, что мы могли бы иметь тысячи номеров в запросе (прилагается в UNION ALL SELECT X). Когда количество строк в таблице_ха не велико, оно работает нормально. Теперь представьте, что у вас тысячи миллионов строк. Затем он становится очень медленным.

Вы знаете, может ли разбиение на разделы работать в таком случае? Как это можно применить к настоящей таблице? Теперь у вас есть другая альтернатива этому?

Примечание: hashloc является BigInt (32) и hash_val является BigInt (64)

+1

Вы отметили свой вопрос с помощью [tag: redis]. Что это связано с Редисом? –

+0

Это правда. Удалены. Спасибо. – juanba1984

ответ

1

Я не думаю, что разделение требуется в данном случае. Я бы порекомендовал вам убедиться, что у вас есть индекс на table_ha.hash_loc.

Я не уверен, почему вы используете подзапрос с UNION вместо просто используя IN() предикат:

SELECT * FROM table_ha 
WHERE hash_loc IN (1, 28700, 28728 ... 28680, 28694); 

Кстати, BIGINT(32) такой же, как BIGINT(64). Смотрите мой ответ на Types in MySQL: BigInt(20) vs Int(20)


Re ваш комментарий:

Разметка только помогает, когда вы ищете на колонке (ов), используемого для ключа разделения. И вы можете только разбить данную таблицу в одну сторону. Индексы более полезны, поскольку вы можете создавать несколько индексов для каждой таблицы.

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

Возможно, мне понравилась моя презентация How to Design Indexes, Really. Также есть видео со мной: https://www.youtube.com/watch?v=ELR7-RdU9XU

+0

Привет, Билл, в этой таблице у меня есть составная primary_key, (hash_loc, hash_val), потому что hash_loc не уникален. Но позже, когда я делаю запросы, я просматриваю только hash_loc. Я думаю, что ваш запрос может работать, если hash_loc не разрешил повторные значения, но на самом деле он содержит одно и то же значение несколько раз. – juanba1984

+0

Но это ничем не отличается от запроса, который вы отправили в своем вопросе. –

+0

Хорошо, спасибо, вы правы. Но, мой вопрос больше сосредоточен на том, как сделать таблицу масштабируемой, когда у меня есть тысячи миллионов строк. Чем больше он растет, тем больше времени требуется, чтобы найти то, что я ищу. Невозможно разделить помощь здесь? – juanba1984

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