My Sql
Реализация языка SQL
Интерфейс для С
Доступ из ASP.NET
Выборка нескольких строк
Если из выборки необходимо извлечь лишь несколько строк, то в конструкции SELECT указывается LIMIT x,y.
x-смещение,
y-максимальное число строк
Параметр x-не обязателен.
При этом на выполнеие сокращенного запроса уходит меньше времени.
Пример:
SELECT * FROM table WHERE d > 900 LIMIT 100
Запись выборки в файл
SELECT ... INTO OUTFILE '/path/to/dir/filename'
Файл не должен существовать.
Чтение выборки из файла
LOAD DATA INFILE '/path/to/dir/filename' INTO TABLE table
Строки файла должны иметь формат вида (поле1\tполе2\t.., где \t - символ табуляции).
AUTO_INCREMENT
Удобной возможностью MySQL является авто увеличение значения поля. Создание такого поля - CREATE TABLE .. pole int(7) AUTO_INCREMENT.. . Причем это поле должно быть объявлено, как первичный ключ и следовательно в таблице оно должно быть единственным. При вставке в таблицу имя такого поля можно не указывать. Иногда бывает нужно при добавлении данных в таблицы знать значения поля с AUTO_INCREMENT для этого существует функция LAST_INSERT_ID().
CREATE TABLE table1 (id AUTO_INCREMENT, comm varchar(20),PRIMARY KEY (id));
INSERT INTO table1 (comm) VALUES('test');
INSERT INTO table2 (id_table1) VALUES (LAST_INSERT_ID());

Или, если вы пишите на perl, то можно использовать значения объекта.
$dbh->{'mysql_insertid'};
Временные таблицы
В версиях 3.xx не поддерживаются вложенные запросы. Но вместо них можно использовать временные таблицы. Пример создания такой таблицы:
CREATE TEMPORARY TABLE table SELECT ... .
А потом делать выборку из нее с дополнительным условием. При написании интерфейса к MySQL на perl, при создании временных таблиц вышеописанным способом, предпочтительнее использовать метод 'do' вместо пары 'prepare-execute', так как эта функция работает быстрее.
Советы по оптимизации
  • После заполнения данными таблицы, выполните команду 'isamchk -a' или 'myisamchk -a', в зависимости от типа таблицы. Эта команда соберет статистику по таблицам, которую сможет использовать оптимизатор.
  • Удалите ненужные скобки в запросе.
  • Всегда, где это возможно используйте WHERE вместо HAVING
  • Свойство атрибута NOT NULL экономит 1бит и ускоряет запросы.
  • Испольэование типа CHAR вместо VARCHAR, позволит ускорить выборку по этим полям на 10-100%. Это целесообразно делать если количество символов поля фиксировано, приэтом оно принимает различные значения. В случае переменной длины, придется расплачиваться дисковым пространством. Вообще поля фиксированной длины обрабатываются быстрее. Выбор того или иного типа зависит от решаемой задачи и требований к БД.
  • Если выборки из нескольких таблиц слишком замедленна, а дополнительые индексы не хочется создавать, разбейте один большой запрос на несколько. Пример из жизни: выборка из 3 таблиц, со "сложным" условиям длилась 4мин.!!!. Причем все таблицы имели первичный ключ. Разбив один запрос на 2 удалось ускорить выборку на 3мин. 54сек. Но задача оптимизации индивидуальна и зависит от структуры БД и данный метод возможно подходит не для всех БД. Так что для собственной базы необходимо проводить исследования.
CREATE TABLE
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]

create_definition:
  col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
            [PRIMARY KEY] [reference_definition]
  or    PRIMARY KEY (index_col_name,...)
  or    KEY [index_name] (index_col_name,...)
  or    INDEX [index_name] (index_col_name,...)
  or    UNIQUE [INDEX] [index_name] (index_col_name,...)
  or    FULLTEXT [INDEX] [index_name] (index_col_name,...)
  or    [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
            [reference_definition]
  or    CHECK (expr)

type:
        TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  or    SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  or    MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  or    INT[(length)] [UNSIGNED] [ZEROFILL]
  or    INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  or    BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  or    REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
  or    NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
  or    CHAR(length) [BINARY]
  or    VARCHAR(length) [BINARY]
  or    DATE
  or    TIME
  or    TIMESTAMP
  or    DATETIME
  or    TINYBLOB
  or    BLOB
  or    MEDIUMBLOB
  or    LONGBLOB
  or    TINYTEXT
  or    TEXT
  or    MEDIUMTEXT
  or    LONGTEXT
  or    ENUM(value1,value2,value3,...)
  or    SET(value1,value2,value3,...)

index_col_name:
        col_name [(length)]

reference_definition:
        REFERENCES tbl_name [(index_col_name,...)]
                   [MATCH FULL | MATCH PARTIAL]
                   [ON DELETE reference_option]
                   [ON UPDATE reference_option]

reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
	TYPE = {ISAM | MYISAM | HEAP | MERGE}
or	AUTO_INCREMENT = #
or	AVG_ROW_LENGTH = #
or	CHECKSUM = {0 | 1}
or	COMMENT = "string"
or	MAX_ROWS = #
or	MIN_ROWS = #
or	PACK_KEYS = {0 | 1}
or	PASSWORD = "string"
or	DELAY_KEY_WRITE = {0 | 1}
or      ROW_FORMAT= { default | dynamic | static | compressed }
or	RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=#  RAID_CHUNKSIZE=#;
or	UNION = (table_name,[table_name...])

select_statement:
	[IGNORE | REPLACE] SELECT ...  (Some legal select statement)
Сортировка win1251
в /etc/my.cnf можно прописать 
[mysqld] 
..... 
default-character-set=cp1251 
Дамп базы
Чтобы сделать дамп базы или таблицы делаем: mysqldump table -u user -h localhost -p > data.dmp Чтобы востановить данные: mysql table -u user -h localhost -p < data.dmp

Hosted by uCoz