Скрытые функции MySQL

Неустранимая ошибка: вызов функции-члена ... на не-объект

происходит с кодом, подобным xyz->method(), где xyz не является объектом и, следовательно, method не может

Это фатальная ошибка, которая остановит сценарий (уведомление о прямой совместимости: это станет захватывающей ошибкой, начиная с PHP 7).

Чаще всего это знак что в коде отсутствуют проверки условий ошибок. Убедитесь, что объект фактически является объектом перед вызовом его методов.

Пример типичного будет

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

В приведенном выше примере запрос не может и prepare() назначит false на $statement. Попытка вызвать метод execute() приведет к Fatal Error, потому что false является «не объектом», потому что значение является логическим.

Выясните , почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.

Если даже сбой ->prepare не выполняется, то ваш дескриптор

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

базы данных

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

не попал в текущий объем . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.

Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например,

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.

Вопросы, относящиеся:

101
задан 9 revs, 2 users 67% 23 May 2017 в 12:13
поделиться

16 ответов

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

В целом весь SQLs я настроил сегодня требуемые подзапросы использования. Прибыв из мира базы данных Oracle, вещи, которые я считал само собой разумеющимся, не работали то же с MySQL. И мое чтение на настройке MySQL заставляет меня прийти к заключению, что MySQL находится позади Oracle с точки зрения оптимизации запросов.

В то время как простые запросы, требуемые для большинства приложений B2C, могут работать хорошо на MySQL, большая часть типа создания отчетов агрегата запросов, необходимых для Создания отчетов Аналитики, кажется, требует, чтобы маленькое планирование и реорганизация SQL-запросов вело MySQL для выполнения их быстрее.

Администрация:

max_connections количество параллельных соединений. Значение по умолчанию является 100 соединениями (151 с тех пор 5.0) - очень маленький.

Примечание:

соединения берут память, и Ваша ОС не смогла обрабатывать много соединений.

Двоичные файлы MySQL для Linux/x86 позволяют Вам иметь до 4 096 параллельных соединений, но сам скомпилированные двоичные файлы часто имеют меньше предела.

Набор table_cache для соответствия количеству открытых таблиц и параллельных соединений. Наблюдайте значение open_tables и если это вырастет быстро, то необходимо будет увеличить его размер.

Примечание:

2 предыдущих параметра могут потребовать большого количества открытых файлов. 20+max_connections+table_cache*2 хорошая оценка для того, в чем Вы нуждаетесь. MySQL на Linux имеет open_file_limit опцию, установите этот предел.

Если у Вас есть сложные запросы sort_buffer_size, и tmp_table_size, вероятно, будут очень важны. Значения будут зависеть от сложности запроса и имеющихся ресурсов, но 4 МБ и 32 МБ, соответственно рекомендуются начальные точки.

Примечание: Это значения "для каждого подключения", среди read_buffer_size, read_rnd_buffer_size и некоторые другие, означая, что это значение могло бы быть необходимо для каждого соединения. Так, рассмотрите свою загрузку и имеющийся ресурс при установке этих параметров. Например, sort_buffer_size выделяется, только если MySQL должен сделать вид. Примечание: будьте осторожны для не исчерпывания памяти.

Если у Вас есть много установленных подключений (т.е. веб-сайт без постоянных соединений), Вы могли бы улучшить производительность путем установки thread_cache_size к ненулевому значению. 16 хорошее значение для запуска с. Увеличьте значение, пока Ваши threads_created не вырастут очень быстро.

PRIMARY KEY:

Может быть только один столбец AUTO_INCREMENT на таблицу, он должен быть индексирован, и он не может иметь ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ

КЛЮЧ обычно является синонимом для ИНДЕКСА. Ключевой PRIMARY KEY атрибута может также быть указан как просто КЛЮЧ при предоставлении в определении столбца. Это было реализовано для совместимости с другими системами баз данных.

PRIMARY KEY является уникальным индексом, где все столбцы ключа должны быть определены как NOT NULL

Если PRIMARY KEY или Уникальный индекс состоят только из одного столбца, который имеет целый тип, можно также обратиться к столбцу как "_rowid" в операторах SELECT.

В MySQL название PRIMARY KEY является ОСНОВНЫМ

В настоящее время, только InnoDB (v5.1?) таблицы поддерживают внешние ключи.

Обычно, Вы создаете все индексы, в которых Вы нуждаетесь, когда Вы составляете таблицы. Любой столбец, объявленный как PRIMARY KEY, КЛЮЧЕВОЙ, УНИКАЛЬНЫЙ, или ИНДЕКС, будет индексирован.

ПУСТОЙ УКАЗАТЕЛЬ означает "не наличие значения". Для тестирования на ПУСТОЙ УКАЗАТЕЛЬ Вы не можете использовать арифметические операторы сравнения такой в качестве =, <или <>. Используйте операторы IS NULL и IS NOT NULL вместо этого:

NO_AUTO_VALUE_ON_ZERO подавляет автоматический инкремент для 0 так, чтобы только ПУСТОЙ УКАЗАТЕЛЬ генерировал следующий порядковый номер. Этот режим может быть полезным, если 0 был сохранен в столбце AUTO_INCREMENT таблицы. (Хранение 0 не является методическими рекомендациями, между прочим.)

Изменить значение AUTO_INCREMENT в противоречии с использоваться для новых строк:

ALTER TABLE mytable AUTO_INCREMENT = value; 

или НАБОР INSERT_ID = значение;

Если иначе не указано, значение начнется: 1000000 или указывают его таким образом:

...) CHARSET=latin1 AUTO_INCREMENT=1 ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ENGINE=MyISAM

МЕТКИ ВРЕМЕНИ:

Значения для столбцов TIMESTAMP преобразовываются от зоны текущего времени до UTC для устройства хранения данных, и от UTC до зоны текущего времени для извлечения.

http://dev.mysql.com/doc/refman/5.1/en/timestamp.html Для одного столбца TIMESTAMP в таблице, можно назначить текущую метку времени значением по умолчанию и значением автоматического обновления.

одна вещь не упустить при использовании одного из этих типов в операторе Where, лучше делать ГДЕ datecolumn = FROM_UNIXTIME (1057941242) и не ГДЕ UNIX_TIMESTAMP (datecolumn) = 1057941242. выполнение последнего не использует в своих интересах индекс на том столбце.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

 UNIX_TIMESTAMP() 
 FROM_UNIXTIME() 
 UTC_DATE()
 UTC_TIME()
 UTC_TIMESTAMP()

если Вы преобразовываете дату и время в метку времени Unix в MySQL:
И затем добавьте 24 часа к нему:
И затем преобразуйте его назад в дату и время, это волшебно теряет час!

Вот то, что происходит. При преобразовании метки времени Unix назад в дату и время учтен часовой пояс, и это именно так происходит, что между 28-м и 29-го октября 2006 мы ушли летнее время и потеряли час.

Начинание с MySQL 4.1.3, CURRENT_TIMESTAMP (), CURRENT_TIME (), CURRENT_DATE (), и FROM_UNIXTIME () функционирует возвращаемые значения в зоне текущего времени соединения, которая доступна как значение time_zone системной переменной. Кроме того, UNIX_TIMESTAMP () предполагает, что его аргументом является значение даты и времени в зоне текущего времени.

Установка зоны текущего времени не влияет на значения, отображенные функциями, такими как UTC_TIMESTAMP (), или оценивает на ДАТЕ, ВРЕМЯ или столбцы DATETIME.

Примечание: ON UPDATE ТОЛЬКО обновляет DateTime, если поле изменяется, Если ОБНОВЛЕНИЕ не приводит ни к каким полям, изменяемым затем, DateTime НЕ обновляется!

Addtionally, Первой МЕТКОЙ ВРЕМЕНИ всегда является АВТОМАТИЧЕСКОЕ ОБНОВЛЕНИЕ по умолчанию даже если не указанный

При работе с Датами я почти всегда convet к Юлианской дате becuase математика Данных являюсь затем простым вопросом добавления или подтрассировки целых чисел, и Секунды с Полуночи по той же причине. Редко, чтобы мне было нужно разрешение времени более прекрасной гранулярности, чем секунды.

И они могут быть сохранены как 4-байтовое целое число, и если пространство является действительно ограниченным, может быть объединен во время UNIX (секунды с эпохи 01.01.1970) как целое число без знака, которое будет хорошо приблизительно до 2 106 как:

'secs за 24 Часа = 86400

'Целое число со знаком макс. val = 2,147,483,647 - может содержать 68 лет Секунд

'Целое число без знака макс. val = 4,294,967,295 - может содержать 136 лет Секунд

Протокол двоичной синхронной передачи данных:

MySQL 4.1 представил протокол двоичной синхронной передачи данных, который позволяет нестроковым значениям данных быть отправленными и возвращенными в собственном формате без преобразования в и от формата строки. (Очень полезный)

В стороне, mysql_real_query () быстрее, чем mysql_query (), потому что он не называет strlen () для работы на строку оператора.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html протокол двоичной синхронной передачи данных поддерживает серверную сторону, подготовил операторы и позволяет передачу значений данных в собственном формате. Протокол двоичной синхронной передачи данных подвергся довольно мало пересмотра во время более ранних выпусков MySQL 4.1.

Можно использовать IS_NUM () макрос, чтобы протестировать, имеет ли поле числовой тип. Передайте значение типа IS_NUM (), и это оценивает к TRUE, если поле является числовым:

Одна вещь отметить состоит в том, что двоичные данные, CAN быть отправленным в регулярном запросе, если Вы выходите из него и помните MySQL, требует только, чтобы обратной косой черты и символа кавычки оставили. Таким образом, это - действительно простой способ ВСТАВИТЬ более короткие двоичные строки, любят, шифровал/Солил пароли, например.

Главный сервер:

http://www.experts-exchange.com/Database/MySQL/Q_22967482.html

http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2

ВЕДОМОЕ УСТРОЙСТВО РЕПЛИКАЦИИ ПРЕДОСТАВЛЕНИЯ НА. к slave_user, ОПРЕДЕЛЕННОМУ 'slave_password'

#Master Binary Logging Config  STATEMENT causes replication 
              to be statement-based -  default

log-bin=Mike
binlog-format=STATEMENT
server-id=1            
max_binlog_size = 10M
expire_logs_days = 120    


#Slave Config
master-host=master-hostname
master-user=slave-user
master-password=slave-password
server-id=2

Двоичный Файл журнала должен читать:

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/

http://dev.mysql.com/doc/refman/5.1/en/mysqlbinlog.html

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

http://dev.mysql.com/doc/refman/5.1/en/binary-log-setting.html

Можно удалить все двоичные файлы журнала с оператором RESET MASTER или подмножество их с ВЕДУЩИМ УСТРОЙСТВОМ ЧИСТКИ

--result-file=binlog.txt TrustedFriend-bin.000030

Нормализация:

http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html

Функции UDF

http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx

http://souptonuts.sourceforge.net/readme_mysql.htm

DataTypes:

http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html

http://www.informit.com/articles/article.aspx?p=1238838&seqNum=2

http://bitfilm.net/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-1/

Одна вещь отметить состоит в том, что на смешанной таблице и с CHAR и с VARCHAR, MySQL изменит CHAR на VARCHAR's

RecNum integer_type НЕПОДПИСАННЫЙ NOT NULL AUTO_INCREMENT, PRIMARY KEY (RecNum)

MySQL всегда представляет даты с годом сначала, в соответствии со стандартным SQL и спецификациями ISO 8601

Misc:

Turing от некоторой функциональности MySQl приведет к меньшим файлам данных и более быстрому доступу. Например:

- datadir укажет каталог данных и

- пропуск-innodb выключит inno опцию и сохранит Вас 10-20M

Больше здесь http://dev.mysql.com/tech-resources/articles/mysql-c-api.html

Загрузите главу 7 - свободный

InnoDB является транзакционным, но существует производительность наверху, которая идет с ним. Я нашел, что таблицы MyISAM достаточны для 90% моих проектов. Таблицы Non-transaction-safe (MyISAM) имеют несколько собственных преимуществ, все из которых происходят потому что:

наверху нет никакой транзакции:

Намного быстрее

Более низкие требования к пространству на диске

Меньше памяти, требуемой выполнить обновления

Каждая таблица MyISAM хранится на диске в трех файлах. Файлы имеют имена, которые начинаются с имени таблицы и имеют расширение для указания на тип файла. .frm хранилища файлов формат таблицы. Файл данных имеет.MYD (MYData) расширение. Индексный файл имеет.MYI (MYIndex) расширение.

Эти Файлы могут быть скопированы в место хранения, неповрежденное, не используя Функцию резервного копирования MySQL Administrators, которая является трудоемкой (так Восстановление),

Прием, заставляют копию этих файлов затем ОТБРОСИТЬ таблицу. При помещении файлов назад, MySQl распознает их и обновит отслеживание таблицы.

Если необходимо Копировать/Восстанавливать,

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

SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;

.. your dump file ..

SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;

Для обширного увеличения скорости перезагрузки добавьте АВТОМАТИЧЕСКУЮ ФИКСАЦИЮ набора команд SQL = 0; в начале файла дампа, и добавляют ФИКСАЦИЮ; команда в конец.

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

Максимальный размер строки в таблице MySQL составляет 65 535 байтов

Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и на = максимальный размер строки (65 535 байтов)

Значения VARCHAR не дополнены, когда они хранятся. Конечные пробелы сохраняются, когда значения сохранены и получены, в соответствии со стандартным SQL.

CHAR и значения VARCHAR в MySQL сравнены без учета с конечными пробелами.

Используя CHAR только ускорит Ваш доступ, если целая запись будет фиксированным размером. Таким образом, при использовании какого-либо переменного объекта размера Вы могли бы также сделать всех их переменным размером. Вы не получаете скорости при помощи CHAR в таблице, которая также содержит VARCHAR.

Предел VARCHAR 255 символов был повышен до 65 535 символов с MySQL 5.0.3

Полнотекстовые поиски поддерживаются для таблиц MyISAM только.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Столбцы BLOB не имеют никакого набора символов, и сортировка и сравнение основаны на числовых значениях байтов в значениях столбцов

Если строгий режим SQL не включен, и Вы присваиваете значение BLOB или Столбцу текста, который превышает максимальную длину столбца, значение является усеченным для установки, и предупреждение сгенерировано.

Полезные команды:

проверьте строгий режим: ВЫБЕРИТЕ @@ глобальный sql_mode;

выключите строгий режим:

НАБОР @@ глобальный sql_mode ='';

НАБОР @@ глобальный sql_mode ='MYSQL40'

или удалите: sql-режим = "STRICT_TRANS_TABLES...

ПОКАЖИТЕ СТОЛБЦЫ ОТ mytable

ВЫБЕРИТЕ макс. (namecount) AS virtualcolumn ОТ mytable ORDER BY virtualcolumn

http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html

http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id last_insert_id ()

получает Вас, PK последней строки, вставленной в текущий поток, макс. (pkcolname), получает Вас, длятся PK в целом.

Примечание: если таблица пуста макс. возвраты (pkcolname), 1 mysql_insert_id () преобразовывает тип возврата собственной API-функции MySQL C mysql_insert_id () к типу длинных (названный интервалом в PHP).

Если Ваш столбец AUTO_INCREMENT будет иметь тип столбца BIGINT, то значение, возвращенное mysql_insert_id (), будет неправильным. Вместо этого используйте внутреннюю функцию MySQL SQL LAST_INSERT_ID () в SQL-запросе.

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

Просто примечание, что, когда Вы пытаетесь вставить данные в таблицу и Вы получаете ошибку:

Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’

использование чего-то как

INSERT INTO table (this, that) VALUES ($this, $that)

это - потому что Вы не получили апострофов вокруг значений, Вы пытаетесь вонзиться в таблицу. Таким образом, необходимо изменить код на:

INSERT INTO table (this, that) VALUES ('$this', '$that') 

напоминание, что '' используются для определения полей MySQL, баз данных, или таблиц, не значений ;)

Потерянное соединение с сервером во время запроса:

http://dev.mysql.com/doc/refman/5.1/en/gone-away.html

http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html

http://dev.mysql.com/doc/refman/5.1/en/show-variables.html

http://dev.mysql.com/doc/refman/5.1/en/option-files.html

http://dev.mysql.com/doc/refman/5.1/en/error-log.html

Настройка запросов

http://www.artfulsoftware.com/infotree/queries.php?&bw=1313

Хорошо этого должно быть достаточно для приобретения премии, я думал бы... Фрукты многих часов и многих проектов с большой свободной базой данных. Я разрабатываю серверы данных приложения на платформах окон главным образом с MySQL. Худшая путаница, которую я должен был разгладить, была

Окончательный кошмар унаследованной базы данных MySQL

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

При нахождении этого удивительно полезным выразите благодарность путем голосования его.

Также проверьте мои другие статьи и отчеты в: www.coastrd.com

161
ответ дан 10 revs, 4 users 99% 24 November 2019 в 04:37
поделиться

Вот некоторые мои подсказки - я вел блог о них в моем блоге ( Ссылка )

  1. , Вы не должны использовать знак при объявлении переменных.
  2. необходимо использовать разделитель (значение по умолчанию'';) для разграничения конца оператора - Ссылка
  3. , Если Вы пытающийся переместить данные между SQL MS 2005 и MySQL туда являетесь несколькими обручами для перехода через - Ссылка
  4. Выполнение чувствительных к регистру соответствий в MySQL - ссылка
3
ответ дан Nikhil 24 November 2019 в 04:37
поделиться

Если Вы собираетесь быть работой с большими и/или высокими базами данных InnoDb транзакции, изучают и понимают "ШОУ СОСТОЯНИЕ INNODB" Блог Производительности Mysql, это станет Вашим другом.

3
ответ дан Hawk Kroeger 24 November 2019 в 04:37
поделиться

Некоторые вещи можно найти интересным:

<query>\G -- \G in the CLI instead of the ; will show one column per row
explain <query>; -- this will show the execution plan for the query
6
ответ дан SorinV 24 November 2019 в 04:37
поделиться

Мне особенно нравится встроенная поддержка MySQL inet_ntoa() и inet_aton(). Это делает обработку IP-адресов в таблицах очень простой (по крайней мере, пока они - только адреса IPv4!)

11
ответ дан Alnitak 24 November 2019 в 04:37
поделиться

Команда для обнаружения, кто делает что:

mysql> show processlist;
show processlist;
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
| Id | User        | Host            | db   | Command | Time | State                            | Info             |
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
|  1 | root        | localhost:32893 | NULL | Sleep   |    0 |                                  | NULL             |
|  5 | system user |                 | NULL | Connect |   98 | Waiting for master to send event | NULL             |
|  6 | system user |                 | NULL | Connect | 5018 | Reading event from the relay log | NULL             |
+-----+------+-----------+---------+---------+-------+-------+------------------+
3 rows in set (0.00 sec) 

И можно уничтожить процесс с:

mysql>kill 5 
15
ответ дан CMS 24 November 2019 в 04:37
поделиться

Команда для обнаружения, какие таблицы в настоящее время находятся в кэше:

mysql> SHOW open TABLES FROM test;
+----------+-------+--------+-------------+
| DATABASE | TABLE | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | a     |      3 |           0 |
+----------+-------+--------+-------------+
1 row IN SET (0.00 sec)

(блог производительности MySQL From )

21
ответ дан Eran Galperin 24 November 2019 в 04:37
поделиться

Одна из не столь скрытой функции MySQL - то, что это не действительно хорошо в том, чтобы быть SQL, совместимым, ну, в общем, не ошибки действительно, но, больше глюки ...:-)

22
ответ дан mat 24 November 2019 в 04:37
поделиться

Не скрытая функция, но полезный, тем не менее: http://mtop.sourceforge.net/

4
ответ дан Eddy 24 November 2019 в 04:37
поделиться

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

Вы можете использовать innodb_file_per_table , который поместит каждую таблицу в отдельное табличное пространство, которое будет удалено при удалении таблицы или базы данных.

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

Использование табличных пространств для отдельных таблиц

1
ответ дан 24 November 2019 в 04:37
поделиться

При использовании cmdline Mysq вы можете взаимодействовать с командной строкой (на машинах Linux - не уверен, есть ли эквивалентный эффект в Windows), используя визг / восклицательный знак. Например:

\! cat file1.sql

отобразит код для file1.sql. Чтобы сохранить ваш оператор и запрос в файл, используйте функцию tee

\T filename

, чтобы отключить это, используйте \ t

Наконец, чтобы запустить сценарий, который вы уже сохранили, используйте "имя файла источника". Конечно, нормальной альтернативой является указание имени сценария при запуске mysql из командной строки:

    mysql -u root -p < case1.sql

Надеюсь, это кому-то пригодится!

Изменить: Только что вспомнил еще один - при вызове mysql из командной строки вы можете использовать переключатель -t, чтобы вывод был в формате таблицы - настоящее благо для некоторых запросов (хотя, конечно, завершение запросов с помощью \ G, как упоминалось здесь в другом месте, также полезно в это респект). Намного больше о различных переключателях Инструмент командной строки

Только что обнаружил изящный способ изменить порядок сортировки (обычно используйте Case ...) Если вы хотите изменить порядок сортировки (возможно, отсортировать по 1, 4, 3, 2 вместо 1, 2, 3,4), вы можете использовать функцию поля в предложении Order by. Например,

Сортировать по полю (sort_field, 1,4,3,2)

3
ответ дан 24 November 2019 в 04:37
поделиться

mysqlsla - один из наиболее часто используемых инструментов для анализа журнала медленных запросов. Вы можете увидеть 10 самых худших запросов с тех пор, как вы последний раз выкатывали журналы медленных запросов. Он также может сказать вам, сколько раз был запущен BAD-запрос и сколько общего времени он занял на сервере.

Он также может сказать вам, сколько раз был запущен BAD-запрос и сколько общего времени он занял на сервере.

Он также может сказать вам, сколько раз был запущен BAD-запрос и сколько общего времени он занял на сервере.

2
ответ дан 24 November 2019 в 04:37
поделиться

Команда "pager" в клиенте

Если у вас есть, скажем, 10 000 строк в вашем результате и вы хотите их просмотреть (это предполагает "меньше" и "тройник" доступны команды, что обычно имеет место в Linux; в Windows YMMV.)

pager less
select lots_of_stuff FROM tbl WHERE clause_which_matches_10k_rows;

И вы получите их в программе просмотра файлов "less", чтобы вы могли легко пролистывать их, выполнять поиск и т. д.

Также

pager tee myfile.txt
select a_few_things FROM tbl WHERE i_want_to_save_output_to_a_file;

Удобно записывать в файл.

7
ответ дан 24 November 2019 в 04:37
поделиться

Я люблю на повторяющийся ключ (AKA upsert, merge) для всех видов счетчиков, созданных лениво:

insert into occurances(word,count) values('foo',1),('bar',1) 
  on duplicate key cnt=cnt+1

Вы можете вставить много строк в один запрос и немедленно обработать повторяющийся индекс для каждой из строк.

11
ответ дан 24 November 2019 в 04:37
поделиться

Опять же - не совсем скрытые функции, но очень удобные:

Функция

Легко захватить DDL:

SHOW CREATE TABLE CountryLanguage

вывод:

CountryLanguage | CREATE TABLE countrylanguage (
  CountryCode char(3) NOT NULL DEFAULT '',
  Language char(30) NOT NULL DEFAULT '',
  IsOfficial enum('T','F') NOT NULL DEFAULT 'F',
  Percentage float(4,1) NOT NULL DEFAULT '0.0',
  PRIMARY KEY (CountryCode,Language)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Функция: GROUP_CONCAT () агрегатная функция Создает объединенную строку своих аргументов для каждой детали и агрегирует путем объединения их для каждой группы.

Пример 1: простой

SELECT   CountryCode
,        GROUP_CONCAT(Language) AS List
FROM     CountryLanguage
GROUP BY CountryCode             

Выход:

+-------------+------------------------------------+
| CountryCode | List                               |
+-------------+------------------------------------+
| ABW         | Dutch,English,Papiamento,Spanish   |
. ...         . ...                                .
| ZWE         | English,Ndebele,Nyanja,Shona       |
+-------------+------------------------------------+

Пример 2: несколько аргументов

SELECT   CountryCode
,        GROUP_CONCAT(
             Language
,            IF(IsOfficial='T', ' (Official)', '')
         )               AS List
FROM     CountryLanguage
GROUP BY CountryCode

Выход:

+-------------+---------------------------------------------+
| CountryCode | List                                        |
+-------------+---------------------------------------------+
| ABW         | Dutch (Official),English,Papiamento,Spanish |
. ...         . ...                                         .
| ZWE         | English (Official),Ndebele,Nyanja,Shona     |
+-------------+---------------------------------------------+

Пример 3: Использование настраиваемого разделителя

SELECT   CountryCode
,        GROUP_CONCAT(Language SEPARATOR ' and ') AS List
FROM     CountryLanguage
GROUP BY CountryCode

Выход:

+-------------+----------------------------------------------+
| CountryCode | List                                         |
+-------------+----------------------------------------------+
| ABW         | Dutch and English and Papiamento and Spanish |
. ...         . ...                                          .
| ZWE         | English and Ndebele and Nyanja and Shona     |
+-------------+----------------------------------------------+

Пример 4: Управление порядком элементы списка

SELECT   CountryCode
,        GROUP_CONCAT(
         Language
         ORDER BY CASE IsOfficial WHEN 'T' THEN 1 ELSE 2 END DESC
         ,        Language
         )               AS List
FROM     CountryLanguage
GROUP BY CountryCode

Вывод:

+-------------+------------------------------------+
| CountryCode | List                               |
+-------------+------------------------------------+
| ABW         | English,Papiamento,Spanish,Dutch,  |
. ...         . ...                                .
| ZWE         | Ndebele,Nyanja,Shona,English       |
+-------------+------------------------------------+

Функция: COUNT (DISTINCT) с несколькими выражениями

Вы можете использовать несколько выражений в выражении COUNT (DISTINCT ...) для подсчета количества комбинаций.

SELECT COUNT (DISTINCT CountryCode, Language) FROM CountryLanguage

Feature / Gotcha: Нет необходимости включать неагрегированные выражения в список GROUP BY

Большинство СУБД применяют GROUP BY, совместимую с SQL92, которая требует, чтобы все неагрегированные выражения -агрегированные выражения в списке SELECT для отображения в GROUP BY. В этих СУБД этот оператор:

SELECT     Country.Code, Country.Continent, COUNT(CountryLanguage.Language)
FROM       CountryLanguage 
INNER JOIN Country 
ON         CountryLanguage.CountryCode = Country.Code
GROUP BY   Country.Code

недействителен, поскольку список SELECT содержит неагрегированный столбец Country.Continent, который не отображается в списке GROUP BY. В этих СУБД вы должны либо изменить список GROUP BY, чтобы он читал

GROUP BY   Country.Code, Country.Continent

, либо вы должны добавить какой-то бессмысленный агрегат в Country.Continent, например

SELECT     Country.Code, MAX(Country.Continent), COUNT(CountryLanguage.Language)

. Дело в том, что логически нет ничего, что требовало бы Эта страна.Континент должна быть объединена. Смотрите, Country.Code - это первичный ключ таблицы Country. Country.Continent также является столбцом из таблицы Country и, таким образом, по определению функционально зависит от первичного ключа Country.Code. Таким образом, в Country.Continent должно существовать ровно одно значение для каждой отдельной Country.Code. Если вы это понимаете, тогда вы понимаете, что нет смысла ни агрегировать его (есть только одно значение, верно), ни группировать по нему (так как это победило '' t сделать результат более уникальным, поскольку вы уже группируете по pk)

В любом случае - MySQL позволяет вам включать неагрегированные столбцы в список SELECT, не требуя, чтобы вы также добавляли их в предложение GROUP BY.

Проблема в том, что MySQL не защищает вас в случае, если вы используете неагрегированный столбец. Итак, такой запрос:

SELECT     Country.Code, COUNT(CountryLanguage.Language), CountryLanguage.Percentage
FROM       CountryLanguage 
INNER JOIN Country 
ON         CountryLanguage.CountryCode = Country.Code
GROUP BY   Country.Code

будет выполнен без жалоб, но столбец CountryLanguage.Percentage будет содержать бессмысленные значения (то есть, из процентных значений всех языков будет выбрано одно из доступных значений процента случайно или, по крайней мере, вне вашего контроля.

См .: Разоблачение группы мифами

10
ответ дан 24 November 2019 в 04:37
поделиться

Actually documented, but very annoying: automatic conversions for incorrect dates and other incorrect input.

Before MySQL 5.0.2, MySQL is forgiving of illegal or improper data values and coerces them to legal values for data entry. In MySQL 5.0.2 and up, that remains the default behavior, but you can change the server SQL mode to select more traditional treatment of bad values such that the server rejects them and aborts the statement in which they occur.

As for dates: sometimes you'll be "lucky" when MySQL doesn't adjust the input to nearby valid dates, but instead stores it as 0000-00-00 which by definition is invalid. However, even then you might have wanted MySQL to fail rather than silently storing this value for you.

2
ответ дан 24 November 2019 в 04:37
поделиться