Первое, что вы должны знать, это то, что индексы - это способ избежать сканирования всей таблицы, чтобы получить результат, который вы ищете.
Существуют различные типы индексов, и они реализованы на уровне хранилища, поэтому между ними нет стандарта, и они также зависят от используемого механизма хранения.
Для 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
.
Некоторые факты, которые вы можете рассмотреть каждый раз, когда хотите поговорить об оптимизации:
InnoDB
. SELECT
, разделив его на два шага, сделав первые значения хранилища во вновь созданной таблице в памяти, а затем выполните более тяжелые запросы в этой второй таблице. У MySQL также есть и другие индексы, но я думаю, что B + Tree один из самых используемых когда-либо, а хэш - хорошая вещь, но вы можете найти другие в Документация по MySQL .
Я настоятельно рекомендую вам прочитать книгу «Высокая производительность MySQL», ответ выше определенно основывался на ее главе об индексах.
Ваш метод вызова должен использовать вашу первую опцию
'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
, а затем обработать переданный объект.
Конструкторский подход лучше, потому что он может быть «проверен компилятором»