MYSQL. Золотой фонд запросов.
1. Как найти первый незанятый идентификатор:
SELECT (mytable.id+1) as new_id FROM mytable WHERE (SELECT 1 FROM mytable as st WHERE st.id=(mytable.id+1)) IS NULL ORDER BY mytable.id LIMIT 1
то же, но начиная с 1000:
SELECT (mytable.id+1) as new_id FROM mytable WHERE mytable.id>1000 AND (SELECT 1 FROM mytable as st WHERE st.id=(mytable.id+1)) IS NULL ORDER BY mytable.id LIMIT 1
2. Не помню для чего:
(SELECT * ORDER BY `f1` DESC LIMIT 15) ORDER BY `f2` DESC;
3. Как найти количество подстрок в строке:
SELECT (LENGTH(строка) - LENGTH(REPLACE(строка, подстрока, ''))) / LENGTH(подстрока) FROM ...
4. Пропустить определенные таблицы в mysqldump:
mysqldump -h <host> -u <username> -p <schema> --no-data > db-structure.sql
mysqldump -h <host> -u <username> -p <schema> --no-create-info --ignore-table=schema.table1 --ignore-table=schema.table2 > db-data.sql
5. Как выбрать с LEFT JOIN только одну запись?
Правильный ответ - не использовать LEFT JOIN. Выигрыш во времени на 1-2 порядка.
SELECT u.*, (SELECT video_id FROM video_stats v where u.member_id=v.member_id limit 1) as video_id FROM users u;
6. Максимальный возможный размер памяти, используемый СУБД
SELECT @@key_buffer_size,
@@query_cache_size,
@@innodb_buffer_pool_size,
@@innodb_log_buffer_size,
@@max_allowed_packet,
@@max_connections,
@@read_buffer_size,
@@read_rnd_buffer_size,
@@sort_buffer_size,
@@join_buffer_size,
@@binlog_cache_size,
@@net_buffer_length,
@@thread_stack,
@@tmp_table_size,
( @@key_buffer_size
+ @@query_cache_size
+ @@innodb_buffer_pool_size
+ @@innodb_log_buffer_size
+ @@max_allowed_packet
+ @@max_connections * (
@@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@net_buffer_length * 2
+ @@thread_stack
+ @@tmp_table_size )
) / (1024 * 1024 * 1024) AS MAX_MEMORY_GB