Порядок столбцов в вторичном индексе [дубликат]

Вы можете сделать что-то более общее в выборе свойств, но определенно о типе, который вы выбираете, в вашем случае «Заказ»:

записывать вашу функцию как общую:

public List<Order> GetOrderList<T>(IEnumerable<Order> orders, Func<Order, T> propertySelector)
        {
            return (from order in orders
                    orderby propertySelector(order)
                    select order).ToList();
        } 

, а затем использовать его следующим образом:

var ordersOrderedByDate = GetOrderList(orders, x => x.OrderDate);

Вы можете быть еще более общим и определить открытый тип для того, что вы хотите заказать:

public List<T> OrderBy<T,P>(IEnumerable<T> collection, Func<T,P> propertySelector)
        {
            return (from item in collection
                    orderby propertySelector(item)
                    select item).ToList();
        } 

и использовать его таким же образом:

var ordersOrderedByDate = OrderBy(orders, x => x.OrderDate);

Какой глупый ненужный сложный способ сделать стиль LINQ «OrderBy», но он может дать вам представление о том, как он может быть реализован в общий способ

15
задан RichardTheKiwi 24 January 2011 в 00:41
поделиться

3 ответа

Порядок столбцов должен соответствовать порядку, в котором столбцы запрашиваются позже, или MySQL не будет их использовать. Это вопрос, о котором вам следует подумать.

Подробнее здесь .

UPDATE:

Возможно, ваш вопрос о мощности прочитайте этот . Это похоже на ваш вопрос? Ответит ли он на это?

9
ответ дан Community 17 August 2018 в 16:52
поделиться
  • 1
    Я позабочусь о последовательности (большинство из них можно использовать для запросов с одним столбцом и т. Д.), Но все же - у меня есть гибкость, чтобы решить, кто первый, а кто второй. Я ищу подсказку, чтобы выбрать, что происходит. – sbargay 24 January 2011 в 01:03
  • 2
    Вы прочитали ссылку? Либо я не понимаю вопроса, либо ответ дается и «в порядке, в котором они обычно запрашиваются». – FabianB 24 January 2011 в 01:07
  • 3
    Да, я прочитал: индекс по столбцам a = мощность = 23, b = мощность = 1000000, c = мощность = 500000. Мои запросы всегда нуждаются в столбцах a, b или a, b, c. – sbargay 24 January 2011 в 01:12
  • 4
    Затем ваш индекс должен быть включен (a, b, c), если вы хотите, чтобы оба запроса могли использовать индекс для всех столбцов 2/3. – Dan Grossman 24 January 2011 в 01:17
  • 5
    [This Enter thing получил этот комментарий посередине] Да, я прочитал его: например. индекс по столбцам a = мощность = 23, b = мощность = 1000000, c = мощность = 500000. Мои запросы нужны столбцы a, a, c или a, b, c. Я могу в принципе создать индекс (c, a, b) + (a) или (a, b, c) + (a, c) – sbargay 24 January 2011 в 01:20

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

или, может быть, это зависит от того, оптимизирую ли я скорость или пространство?

Позвольте мне сказать так. В чем смысл использования меньшего хранилища, если он вызывает индекс not to be used at all? Индекс низкой мощности (в порядке столбцов) обычно не используется, если он не является индексом покрытия для запроса, потому что будет очень дорого вернуться к данным для других столбцов.

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

4
ответ дан RichardTheKiwi 17 August 2018 в 16:52
поделиться
  • 1
    Хорошо - скажем, что я сохраняю идентификатор страны (низкая мощность) и идентификатор человека (высокая мощность). тот же идентификатор лица может существовать в нескольких странах. Должен ли я указывать country_id, person_id или наоборот? Мне иногда нужно извлекать всех людей из страны, а иногда и достигать всех людей с одним и тем же лицом – sbargay 12 February 2011 в 23:21
WHERE person_id = 123 AND country_code = 'AT'

Использовать

INDEX(person_id, country_code)  -- in EITHER order!

Разница no в скорости или пробела для порядка столбцов индекса в этот случай.

Да, у MyISAM было «сжатие индекса», но оно больше не используется.

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

INDEX(person_id)  -- is better than
INDEX(country_code)

Но ни один из них не так хорош, как составной индекс.

Для

WHERE person_name LIKE 'James%' AND country_code = 'UK'

лучшим индексом является

INDEX(country_code, person_name)   -- in THIS order!

Порядок в WHERE не влияет на оптимизацию.

Дополнительные советы и обсуждение: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

0
ответ дан Rick James 17 August 2018 в 16:52
поделиться
Другие вопросы по тегам:

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