Как передать объект в экземпляр формы по умолчанию

Первое, что вы должны знать, это то, что индексы - это способ избежать сканирования всей таблицы, чтобы получить результат, который вы ищете.

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

InnoDB и индекс B + Tree

Для InnoDB наиболее распространенным типом индекса является индекс B + Tree, который хранит элементы в отсортированном порядке. Кроме того, вам не нужно обращаться к реальной таблице, чтобы получить индексированные значения, что ускоряет ваш запрос.

«Проблема» в этом типе индекса заключается в том, что вам нужно запросить самую левую значение для использования индекса. Итак, если ваш индекс имеет два столбца, скажем last_name и first_name, порядок, который вы запрашиваете для этих полей, имеет большое значение.

Итак, учитывая следующую таблицу:

CREATE TABLE person (
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    INDEX (last_name, first_name)
);

запрос использовал бы индекс:

SELECT last_name, first_name FROM person
WHERE last_name = "John" AND first_name LIKE "J%"

Но следующий не будет

SELECT last_name, first_name FROM person WHERE first_name = "Constantine"

Поскольку вы сначала запрашиваете столбец first_name, и это не самый левый столбец в индексе.

Этот последний пример еще хуже:

SELECT last_name, first_name FROM person WHERE first_name LIKE "%Constantine"

Так как теперь вы сравниваете правую часть самого правого поля в индексе.

Хэш-индекс

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

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

Если у вас есть большое поле VARCHAR, вы можете «эмулировать» использование хеш-индекса при использовании B-Tree, создав другой столбец и сохранив хэш большого значения на нем. Предположим, вы храните URL-адрес в поле, и значения довольно велики. Вы также можете создать целое поле с именем url_hash и использовать хеш-функцию, такую ​​как CRC32 или любую другую хеш-функцию, чтобы хэшировать URL-адрес при его вставке. И затем, когда вам нужно запросить это значение, вы можете сделать что-то вроде этого:

SELECT url FROM url_table WHERE url_hash=CRC32("http://gnu.org");

Проблема с приведенным выше примером заключается в том, что поскольку функция CRC32 генерирует довольно небольшой хеш, вы В итоге в результате хэширования будет много столкновений. Если вам нужны точные значения, вы можете исправить эту проблему, выполнив следующие действия:

SELECT url FROM url_table 
WHERE url_hash=CRC32("http://gnu.org") AND url="http://gnu.org";

По-прежнему стоит хэш-вещи, даже если число столкновений является большим, потому что вы будете выполнять только второе сравнение ( string).

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

Завершить

Некоторые факты, которые вы можете рассмотреть каждый раз, когда хотите поговорить об оптимизации:

  1. Целочисленное сравнение намного быстрее, чем сравнение строк. Это можно проиллюстрировать на примере эмуляции хэш-индекса в InnoDB.
  2. Возможно, добавление дополнительных шагов в процесс делает его быстрее, а не медленнее. Это можно проиллюстрировать тем фактом, что вы можете оптимизировать SELECT, разделив его на два шага, сделав первые значения хранилища во вновь созданной таблице в памяти, а затем выполните более тяжелые запросы в этой второй таблице.

У MySQL также есть и другие индексы, но я думаю, что B + Tree один из самых используемых когда-либо, а хэш - хорошая вещь, но вы можете найти другие в Документация по MySQL .

Я настоятельно рекомендую вам прочитать книгу «Высокая производительность MySQL», ответ выше определенно основывался на ее главе об индексах.

0
задан user3844416 21 March 2019 в 15:30
поделиться

1 ответ

Ваш метод вызова должен использовать вашу первую опцию

'Careful about declaring this in a sub, because when that sub ends, the form might get closed.
'It might be best to declare this as an instance var (aka form-level var)
Private DetailsForm As frmOrder

'this could go in an event handler, or anywhere
DetailsForm = New frmOrder(oOrder)
DetailsForm.Show()

Вам нужно будет добавить конструктор к вашему DetailsForm:

Private _oOrder as OrderType

Public Sub New(oOrder As OrderType)
     'Best to save it to a private instance var and process it during Form_Load
     _oOrder = oOrder
End Sub

Затем, когда ваш Form_Load() будет запущен, он может использовать ваш личный экземпляр var для заполнения ваших TextBox заданий, как вы хотите.

Второй, но менее красноречивый подход заключается в добавлении открытого свойства в форму, и после вызова .Show() вы можете присвоить значение DetailsForm.OrderObject = oOrder, а затем обработать переданный объект.

Конструкторский подход лучше, потому что он может быть «проверен компилятором»

0
ответ дан tgolisch 21 March 2019 в 15:30
поделиться
Другие вопросы по тегам:

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