+ All Categories
Home > Documents > My sql technical reference manual

My sql technical reference manual

Date post: 07-Nov-2014
Category:
Upload: mir-majid
View: 879 times
Download: 3 times
Share this document with a friend
Description:
 
Popular Tags:
88
MySQL Technical Reference Manual. What is MySQL? MySQL is a SQL (Structured Query Language) database server. SQL is the most popular database language in the world. MySQL is a client server implementation that consists of a server daemon mysqld and many different client programs/libraries. The main goals of MySQL are speed and robustness. The base upon which MySQL is built is a set of routines that have been used in a highly demanding production environment for many years. The main features in MySQL Multi-threaded C, C++, JAVA, Perl, Python and TCL API’s. Lots of column types like: signed/unsigned integers 1,2,3,4,8 bytes long, FLOAT, CHAR,VARCHAR, TEXT, BLOB, DATE, SET and ENUM types. Join optimizer with one-sweep multi-join (all joins made in one pass). Full function support in the SELECT and WHERE parts. Example: select column1+column2 from table where column1/column2 > 0 SQL functions are implemented through a very optimized class library and should be as fast as they can get! Usually there shouldn’t be any memory allocation at all after the query initialization. Full support for SQL GROUP BY and ORDER BY. Support for group functions (SUM, MAX and MIN). A privilege and password system with is very flexible and secure. Allows host based verification. All password traffic on the net is encrypted. Very fast B-tree disk tables with key compression. Fixed and variable length records. 16 indexes/table. Each index may consist of 1 to 15 columns/parts of columns. Max key length is 127 bytes. A key may be a prefix of a CHAR field. 1
Transcript
Page 1: My sql technical reference manual

MySQL Technical Reference Manual.

What is MySQL?MySQL is a SQL (Structured Query Language) database server. SQL is the most popular database language in the world. MySQL is a client server implementation that consists of a server daemon mysqld and many different client programs/libraries.The main goals of MySQL are speed and robustness.The base upon which MySQL is built is a set of routines that have been used in a highly demanding production environment for many years.

The main features in MySQL Multi-threaded C, C++, JAVA, Perl, Python and TCL API’s. Lots of column types like: signed/unsigned integers 1,2,3,4,8 bytes

long, FLOAT, CHAR,VARCHAR, TEXT, BLOB, DATE, SET and ENUM types. Join optimizer with one-sweep multi-join (all joins made in one pass). Full function support in the SELECT and WHERE parts.

Example: select column1+column2 from table where column1/column2 > 0 SQL functions are implemented through a very optimized class library

and should be as fast as they can get! Usually there shouldn’t be any memory allocation at all after the query initialization.

Full support for SQL GROUP BY and ORDER BY. Support for group functions (SUM, MAX and MIN).

A privilege and password system with is very flexible and secure. Allows host based verification.

All password traffic on the net is encrypted. Very fast B-tree disk tables with key compression. Fixed and variable length records. 16 indexes/table. Each index may consist of 1 to 15 columns/parts of

columns. Max key length is 127 bytes. A key may be a prefix of a CHAR field.

ODBC Open-DataBase-Connectivity for Windows95 (with source). All ODBC 2.5 functions and lots of others.

In memory hash tables always used as temporary tables. Can handle big databases (we are using MySQL with some databases

that contain 50,000,000 records). All columns have default values. One can always use INSERT on any

subset of columns. Uses GNU autoconf for portability. Written in C and C++. Tested with gcc 2.7.2. A thread based memory allocation system (very fast and no memory

trashing).

1

Page 2: My sql technical reference manual

No memory leaks. Tested with a commercial memory leakage detector (purify).

A very fast table check and repair utility (isamchk). All data saved in ISO8859_1 format. All comparisons for normal string

columns are case insensitive. Full ISO8859_1 (Latin1) support. For example Scandinavian åäö is

allowed in table and column names. Sorts by ISO8859_1 Latin1 (the Swedish way at the moment). It is

possible to change this in the source by adding new sort order arrays. Alias on tables and columns as in the SQL92 standard. avg & count). INSERT,UPDATE and DELETE returns how many rows were affected. Function names do not clash with table or column names. For example

ABS is a valid column name. The only restriction is that space is not allowed between a function name and the ’(’ when using functions.

All MySQL commands have --help or -? for help. The server currently supports error messages to clients in many

languages. See section What languages are supported by MySQL.. The clients uses a TCP connection or unix socket when connecting to

the MySQL server. User commands as show tables, show keys from table and show

columns from Table

Problems starting MySQLCheck the log file to see if mysqld started up correctly.cd <localstatedir default /usr/local/var>tail <your host name>.logTo verify that MySQL is working, run the following tests:> cd /usr/local/bin> ./mysqlshow+-----------+| Databases |+-----------+| mysql |+-----------+> ./mysqlshow mysqlDatabase: mysql+--------+| Tables |+--------+| db || host || user |+--------+> ./mysql -e "select host,db,user from db" mysql+------+--------+------+| host | db | user |+------+--------+------+| % | test | |

2

Page 3: My sql technical reference manual

| % | test_% | |+------+--------+------+There is also a benchmark suite so you can compare how MySQL perform on different platforms. In the near future this will also be used to compare MySQL to other SQL databases.> cd bench> run-auto-increment-testYou can also run the tests in the test subdirectory. To run ‘auto_increment.tst’:./mysql -vf test < ./tests/auto_increment.tst24Expected results are shown in the file ‘./tests/auto_increment.res’.

Automatic start/stop of MySQLTo start or stop MySQL use the following commands:scripts/mysql.server stopscripts/mysql.server startYou might want to add these start and stop commands in the appropriate places in your /etc/rc* fileswhen you start using MySQL for production applications.

How to debug MySQLIf you are porting MySQL to an new system you should first try to get mysys/thr_lock andmysys/thr_alarm to work. They shouldn’t core dump and not print any error (they also print a lot ofother information). Also see the file ‘PORTING’ in the distribution.By starting bin/safe_mysqld with --log you will get a log ininstall-directory/var/’hostname’.log (the top level database directory). This log willcontain all successful connections and all commands issued to the MySQL server.If you have compiled MySQL with --with-debug=yes you can can also get a very informative logwith:libexec/mysqld --debugwhich makes a large log in /tmp/mysql.trace. The default debug option isd:i:t:o,/tmp/mysql.trace.You can get a smaller log with:libexec/mysqld --debug=d,info,query,general:o,/tmp/mysql.traceor an even smaller (on stdout):libexec/mysqld --debug=d,general,queryYou can get more information about the debug switches by examining the file dbug/dbug.c.If you have a problem with mysqld that it crashes and you want this quickly solved, you shouldinclude a trace file with your mail if possible. Trace files can be posted directly to

3

Page 4: My sql technical reference manual

@email{[email protected]} to avoid long messages to the standard mail list. If the trace file is bigyou should use ftp and send it to ftp://www.tcx.se/pub/mysql/secret/ together with amysqldump of any tables that you think can help to solve the problem. The context of the abovedirectory is hidden for outside users so no one except the TCX staff can look at what you send into it.Go to the first [p 5] , previous [p 19] , next [p 26] , last [p 87] section, table of contents [p 1] .25Go to the first [p 5] , previous [p 24] , next [p 30] , last [p 87] section, table of contents [p 1] .How does MySQL privileges workMySQL has a advanded but non standard security/privileges system.How does the privilege system work?The MySQL privilege system makes sure that each user may do exactly the things that they aresupposed to be allowed to do. The system decides to grant different privileges depending on whichuser connects from which host to which database. The decision is based on the contents of the threetables in the MySQL database: user, host and db.The grant tables privileges on rows are select, insert, update and delete.The table and database privileges are create and drop. Create and drop are for both tables anddatabases. Since a user with a drop grant can delete any table, this is the same thing as a drop grant forthe database.Other privileges give the right to use files (for LOAD DATA INFILE and SELECT INTO OUTFILE)and to use the administrative commands shutdown, reload, refresh and process, to get the currentprocess list.The privilege tables are read into mysqld with mysqladmin reload. If the privilege tables areempty or non-existent or if the server is started with --skip-grant-tables, full access isgranted to everyone.You can always test your privileges with the script mysqlaccess, which Yves Carlier has providedfor the MySQL distribution. See section Why do I get ’Access denied’? [p 78]The host and db fields may contain a SQL regexp with chars % and _. Leaving any of these fieldsempty is equivalent to setting it to ’%’.A host may be localhost, a hostname, an IP number or an SQL expression. An empty host in

4

Page 5: My sql technical reference manual

the db table means any host in the host table. An empty host in the host or user table means anyhost that can create a TCP connection to your server.A db is the name of a database or an SQL regexp.An empty user field means any username will do.An empty password means that the entry will only be used if no password is supplied.The privileges from the user table are OR’ed to the db table. This means that a superuser onlyneeds to be in the user table with all privilege-flags set to Y.Everything granted in the user table is valid for every database that cannot be found in the db table.For this reason, it might be wise to grant users (apart from superusers) privileges on a per-databasebasis only.The host table is mainly there to maintain a list of "secure" servers. At TcX host contains a list ofall machines on the local network. These are granted all privileges.26The connecting user’s privileges are calculated by the following algorithm:1. First sort all three tables by host by putting hosts without wildcards first, followed by hosts withwildcards and entries with host = "". Within each host, di.e. very much like GROUP BYHost, sort by user using the same rules. Finally, in the db table, sort by db using the same rules.In the steps below, we will look through the sorted tables and always use the first match found.2. Get the privileges for the connecting user from the db table using the first match found. Call thisset of privileges P.3. If host = "" for the entry found in the db table, AND P with the privileges for the host in thehost table, i.e. remove all privileges that are not "Y" in both. (If host <> "", P is notaffected. In suchcases, host must have matched the connecting host’s name at least partially.Therefor it can be assumed that the privileges found in this row match the connecting host’sprofile.)4. OR (add) P with the privileges for the user from the user table, i.e. add all privileges that are"Y" in user.The connecting user gets the set of privileges P.Let’s show an example of the sorting and matching! Suppose that the user table contains this:+-----------+----------+-| Host | User | ...

5

Page 6: My sql technical reference manual

+-----------+----------+-| % | root | ...| % | jeffrey | ...| localhost | root | ...| localhost | | ...+-----------+----------+-Then the search order will be:localhost/rootlocalhost/anyany/jeffreyany/rootSo jeffrey attempting to connect on localhost will be matched by the localhost/any line, not bythe any/jeffrey line. The first match found is used!So if you have access problems, print out the user table, sort it by hand, and see where the match isbeing made.Here follows an example to add a user ’custom’ that can connect from hosts ’localhost’,’server.domain’ and ’whitehouse.gov’. He wants to have password ’stupid’. The database’bankacount’ he only want to use from ’localhost’ and the ’customer’ database he wants to be able toreach from all three hosts.shell> mysql mysql.mysql> insert into users (host,user,password)values(’localhost’,’custom’,password(’stupid’));mysql> insert into users (host,user,password)values(’server.domain’,’custom’,password(’stupid’));mysql> insert into users (host,user,password)values(’whitehouse.gov’,’custom’,password(’stupid’));27mysql> insert into db(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv)values(’localhost’,’bankacount’,’custom’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);mysql> insert into db(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv)values(’%’,’customers’,’custom’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);You can of course also use xmysqladmin, mysql_webadmin, mysqladmin and even xmysql toinsert/change and update values in the privilege tables. You can find these utilities in the Contribdirectory.Adding new user privileges to MySQL

6

Page 7: My sql technical reference manual

To add privileges to the MySQL database:This assumes the current user has insert privileges for the mysql db table and reload privileges. Theserver (mysqld) has to be running. If it is not, start it with safe_mysqld --log &.> mysql mysqlinsert into user values (’%’,’monty’,password(’something’),’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’) ;insert into user (host,user,password) values(’localhost’,’dummy’,") ;insert into user values (’%’,’admin’,",’N’,’N’,’N’,’N’,’N’,’N’,’Y’,’N’,’Y’,’Y’) ;quit> mysqladmin reloadThis makes three new users:MontyFull superuser, but must use password when using MySQL.adminDoesn’t need a password but is only allowed to use mysqladmin reload, mysqladminrefresh and mysqladmin processlist. May be granted individual database privilegesthrough table db.dummyMust be granted individual database privileges through table db.Default privileges.The default privileges (set in ‘scripts/mysql_install_db’) is that root can do anything. Anyuser can do anything with any database whose name is ’test’ or starts with ’test_’. A normal user can’tuse mysqladmin shutdown or mysqladmin processlist. See the script(‘scripts/mysql_install_db’) for an example on how to add other users.The privilege tables are read into mysqld with ’mysqladmin reload’. If the privilege tables are empty(or non-existent) full access are granted to everyone.28A example of permission setup.A common mistake is to try something like:INSERT INTO user VALUES(’%’,’jeffrey’,’bLa81m0’,’Y’,’Y’,’Y’,’N’,’N’,’N’,’N’,’N’, ’N’,’N’);Then (of course) a mysqladmin reload to make the authentication change take effect, then tryingto connect to the server:$ ./mysql -h sqlserver -u jeffrey -p bLa81m0 test Access deniedTry this instead:INSERT INTO user VALUES(’%’,’jeffrey’,password(’bLa81m0’),’Y’,’Y’,’Y’,’N’,’N’,’N’,’N’,’N’,’N’,’N’);And like before mysqladmin reload to make the authentication change take effect.Now things should work.

7

Page 8: My sql technical reference manual

Go to the first [p 5] , previous [p 24] , next [p 30] , last [p 87] section, table of contents [p 1] .29Go to the first [p 5] , previous [p 26] , next [p 52] , last [p 87] section, table of contents [p 1] .MySQL language referenceLiterals. How do you write strings and numbers?STRINGSA string may have ’ or " around it.\ is a escape character. The following escape characters are recognised:\0 A ascii 0 character.\n A newline character.\t A tab character.\r A return character.\b A backspace character.\’ A ’ character.\" A " character.\\ A \ character.\% A % character. This is used in wild-card strings to search after %.\_ A _ character. This is used in wild-card strings to search after _.A ’ inside a string started with ’ may be written as ".A " inside a string started with " may be written as "".MySQL> select ’hello’, "’hello’", ’""hello""’, "’h"e"l"l"o"’, "hel""lo";1 rows in set (0.00 sec)+-------+---------+-----------+-------------+--------+| hello | ’hello’ | ""hello"" | ’h’e’l’l’o’ | hel"lo |+-------+---------+-----------+-------------+--------+| hello | ’hello’ | ""hello"" | ’h’e’l’l’o’ | hel"lo |+-------+---------+-----------+-------------+--------+mysql> select ’hello’, "hello", ’""hello""’, "’ello", ’e"l"lo’, ’\’hello’;1 rows in set (0.00 sec)+-------+-------+-----------+-------+--------+--------+| hello | hello | ""hello"" | ’ello | e’l’lo | ’hello |+-------+-------+-----------+-------+--------+--------+| hello | hello | ""hello"" | ’ello | e’l’lo | ’hello |+-------+-------+-----------+-------+--------+--------+mysql> select "This\nIs\nFour\nlines";1 rows in set (0.00 sec)+--------------------+| ThisIsFourlines |+--------------------+| This30IsFour

8

Page 9: My sql technical reference manual

lines |+--------------------+If you want to insert binary data into a blob the following characters must be represented by escapesequences:\0 Ascii 0. Should be replaced with "\0" (A backslash and a 0 digit).\ Ascii 92, backslash’ Ascii 39, Single quote" Ascii 33, Double quoteNUMBERSIntegers are just a sequence of digits. Floats use . as a decimal separator.Examples of valid numbers are: 1221, 294.42, -32032.6809e+10.NULLWhen using the text file export formats, NULL may be represented by \N. See section LOAD DATAINFILE syntax [p 45]Column types.The following column types are supported:Name Description SizeTINYINT [(max display size)][UNSIGNED] [ZEROFILL]A very small integer. Signed range -128 - 127. Unsignedrange 0 - 255.1SMALLINT [(max displaysize)]. [UNSIGNED][ZEROFILL]A small integer. Signed range -32768 - 32767. Unsignedrange 0 - 65535.2MEDIUMINT [(max displaysize)] [UNSIGNED][ZEROFILL]A medium integer. Signed range -8388608-8388607.Unsigned range 0 - 16777215.3INT [(max display size)][UNSIGNED] [ZEROFILL]A normal integer. xSigned range -2147483648 -2147483647. Unsigned range 0 - 4294967295.4BIGINT [(max display size)][UNSIGNED] [ZEROFILL]A large integer. Signed range -9223372036854775808 -9223372036854775807. Unsigned Range 0 -18446744073709551615.831

9

Page 10: My sql technical reference manual

FLOAT(Precision)A small floating point number. Precision can be 4 or 8.FLOAT(4) is a single precision number and FLOAT(8) is adouble precision number (se the DOUBLE entry). Thissyntax is for ODBC compatibility. Range-3.402823466E+38F - -1.175494351E-38, 0,-1.175494351E-38 - 3.402823466E+38F.4FLOAT [(max displaysize,number of decimals)]A small floating point number. Cannot be unsigned. Range-3.402823466E+38F - -1.175494351E-38, 0,-1.175494351E-38 - 3.402823466E+38F.4DOUBLE PRECISION [(maxdisplay size,number ofdecimals)]A normal floating point number. Cannot be unsigned.Range -1.7976931348623157E+308 --2.2250738585072014E-308, 0,2.2250738585072014E-308 - 1.7976931348623157E+308.8REAL [(length,decimals)] Same as DOUBLE 8DECIMAL [(max displaysize,number of decimals)]An unpacked floating point number. Cannot be unsigned.Currently the same range maximum range as a double.Behaves as a CHAR columnM+DNUMERIC [(length,decimals)] Same as DECIMAL M+DTIMESTAMP [(display size)] An automatic timestamp. 4DATEA type to store date information. Uses the"YYYY-MM-DD" syntax, but may be updated with anumber or a string. Understands at least the followingsyntaxes: ’YY-MM-DD’, ’YYYY-MM-DD’, ’YYMMDD’,’YYMM’, ’YY’. Range 0000-00-00 to 9999-12-31.4TIMEA type to store time information. Uses the "HH:MM:SS"syntax, but may be updated with a number or a string.Understands at least the following syntaxes: ’HH:MM:DD,’HHMMDD’, ’HHMM’, ’HH’.3DATETIMEA type to store date and time information. Format"YYYY-MM-DD HH:MM:SS". Takes 8 bytes. Range’0000-01-01 00:00:00’ - ’9999-12-31 23:59:59’.

10

Page 11: My sql technical reference manual

8CHAR(max_length) [binary]A fixed length string that is always filled up with spaces tothe specified length. Range 1 - 255 characters. All endspace are removed when retrieved. Is sorted and comparedcase insensitively unless the binary keyword is given.MVARCHAR(max_length)[binary]A variable length string that is stored with its length.Maximum range 1 - 255 characters. Is sorted and comparedcase insensitively unless the binary keyword is given.L + 1TINYTEXT and TINYBLOB A TEXT/BLOB with max length of 255 characters. L + 1TEXT and BLOB A TEXT/BLOB with max length of 65535 characters. L + 232MEDIUMTEXT andMEDIUMBLOBA TEXT/BLOB with max length of 1677216 characters. L + 3LONGTEXT and LONGBLOBA TEXT/BLOB with max length of 4294967295characters.L + 4ENUM(’value’,’value2’,...)A string object that can have only one set of allowedvalues. See section More about data types [p 33] .1 or2SET(’value’,’value2’,....)A string object that can have one or many values of a set ofallowed values. See section More about data types [p 33] .1-8More about data typesDatabase size info.In the above table L means the actual length of a instance and M the maximum length. So L+1 for"abcd" means 5 bytes in the database.If you use any data type with a L in the length field you will get a variable length record format.The numeric typesAll integer types can have a optional argument unsigned. This can be used when you only want toallow positive numbers in the column or you need a little bigger numerical range for the column.Also for all integer columns the optional argument ZEROFILL means that the column will be paddedwith zeroes upto the maximum length.

11

Page 12: My sql technical reference manual

Max display size and decimals are for formating and calculation of max column width.TIMESTAMP typeHas a range of 1 Dec 1970 time 0.00 to sometime in the year 2106 and a resolution of one second.Will be automatically updated if not used in a statement that updates a row or if set to NULL. Can be a(part of) a key. Note that if you have many timestamp fields in a row, then only the first timestampfield will be automatically updated. Any timestamp field will be set to the current time if set to NULL.Depending on the display size one gets one of the following formats: "YYYY-MM-DD HH:MM:SS","YY-MM-DD HH:MM:SS", "YYYY-MM-DD" or "YY-MM-DD".TEXT and BLOB typesThese are objects that can have a variable length without upper limit. All TEXT and BLOB objects arestored with is length (saved in 1 to 4 bytes depending on the type of object). The maximum TEXT andBLOB length you can use is dependent on available memory and client buffers. The only differencesbetween TEXT and BLOB is that TEXT is sorted and compared case insensitively while BLOB iscompared case insensitive (by character values). TEXT and BLOB objects CANNOT be keys.A BLOB is a binary large object which can hold any amount of data :) There are 4 kinds of blobs Seesection Column types. [p 31] . Normally one can regard a BLOB as a VARCHAR without a specifiedlimit.33TEXT is a BLOB that is sorted and compared case insensitively.There are some constraints because of the message buffer used. The default size of the buffer is 64Kfor the server and 512K for the clients. To change the buffer length for the server, use mysqld -Omax_allowed_packet=max_blob_length. This allows the message buffer to grow up to thislimit when needed.MyODBC defines BLOB:s as LONGVARBINARY and TEXT:s as LONGVARCHAR.Restrictions for BLOB and TEXT columns:1. A BLOB or TEXT cannot be a key or a part of a key2. When one sorts or groups a BLOB or TEXT only the first max_sort_length (default 1024)of the blob is used. This value can be changed by the -O option when starting the mysqld demon.One can group on an expression involving a BLOB/TEXT: SELECTid,SUBSTR(blob,1,100) GROUP BY 2

12

Page 13: My sql technical reference manual

3. There is no end space truncation for BLOB and TEXT as there is for CHAR and VARCHAR.ENUM typeA string object that can have only one set of allowed values. The value to be stored may be given caseindependently. If one tries to store a non existing value, "" is stored. If used in a number context thisobject returns/stores the value index. If there is less than 255 possible values this object occupies 1byte, else two bytes (with a maximum of 65535 different values). Note that if a integer is put in theENUM you get the corresponding string with the first counting as number zero. Sorting on ENUM typesare done after the order of the strings in the enum.For example the column test ENUM("one","two", "three") can have any off these values:"one""two""three"SET typeA string object that can have one or many values of a set of allowed values. Each value is separated bya ’,’. If used in a number context this object returns/stores the bit positions of the used values. Thisobject occupies (number_of_different_values-1)/8+1 bytes, rounded up to 1,2,3,4 or 8. One can’t havemore than 64 different values. Note that if a integer is put in the SET you get the corresponding stringwith the first bit corresponding to the first string.Sorting on SET types are done numericaly.For example the column test SET("one","two") can have any off these values:"""one""two""one,two"34Column indexesYou can have indexes on all MysQL column types except BLOB and TEXT. Using indexes on therelevant columns is the most important thing is getting you selects to run fast.For CHAR and VARCHAR columns you can have a index on a prefix. The example below show howto create a index for the first 10 characters of a column. This is much faster and requires less diskspace than having a index on the whole field.CREATE TABLE test (name CHAR(200),

13

Page 14: My sql technical reference manual

KEY name (last_name(10));Multiple field indexesMySQL can have one index on parts of different columns.A multiple column key can be considered as a sorted array where the columns are concatenated.Suppose that you have a table:CREATE TABLE test (id INT,last_name CHAR(30),first_name CHAR(30),PRIMARY KEY (id),KEY name (last_name,first_name));Then the key ’name’ is a key over last_name and first_name.The ’name’ key will be used in the following queries:SELECT * FROM test WHERE last_name="Widenius";SELECT * FROM test WHERE last_name="Widenius" AND first_name="Michael";SELECT * FROM test WHERE last_name="Widenius" AND (first_name="Michael" OR first_name="Monty");SELECT * FROM test WHERE last_name="Widenius" and first_name >="M" and first_name < "N";The ’name’ key will NOT be used in the following queries:SELECT * FROM test WHERE first_name="Michael";SELECT * FROM test WHERE last_name="Widenius" or first_name="Michael";Type mapping (to ease moving tabel definitions between differentdatabases engines)To support easier use of code from different SQL vendors, MySQL does supports the followingmappings:35binary(num) char(num) binarychar varying varcharfloat4 floatfloat8 doubleint1 tinyintint2 smallintint3 mediumintint4 intint8 bigintlong varbinary bloblong varchar textmiddleint mediumintvarbinary(num) varchar(num) binaryCREATE TABLE syntax.CREATE TABLE table_name ( create_definition,... )create_definition:column_name type [DEFAULT default_value] [NOT NULL | NULL] [ PRIMARY KEY ]

14

Page 15: My sql technical reference manual

[reference_definition]or PRIMARY KEY ( key_column_name,... )or KEY [key_name] KEY( key_column_name,...)or INDEX [key_name] ( key_column_name,...)or UNIQUE [key_name] ( key_column_name,...)or FOREIGN KEY key_name ( key_column_name,...) [reference_definition]or CHECK (expr)key_column_name:column_name [ (length) ]reference_definition:REFERENCES table_name [( key_coulmn_name,...)][ MATCH FULL | MATCH PARTIAL][ ON DELETE reference_option][ ON UPDATE reference_option]reference_option:RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULTThe FOREIGN KEY, CHECK and REFERENCE syntax are only for compatibility. They don’tactually do anything.If a column doesn’t have a DEFAULT value and is not declared as NOT NULL, the default value isNULL.36ZEROFILL means that number is pre-zeroed to maximal length. With INT(5) ZEROFILL avalue of 5 is retrieved as 00005.BINARY means that the column will be compared case sensitive. The default is that all stringsare compared case insensitive. BINARY is ’sticky’ which means that if a column marked’binary’ is used in a expression, the whole expression is compared ’binary’.INDEX is only a synonym for KEY.If one doesn’t assign a name to a key, the key will get the same name as the first key_columnwith an optional _# to make it unique.Key columns and timestamp columns can’t be NULL. For these columns the NULL attribute issilently removed.With column_name(length) syntax one can specify a key which is only a part of a stringcolumn. This can make the index file much smaller.A number column may have the additional attribute AUTO_INCREMENT to automatically getthe largest value+1 for each insert where column value is NULL or 0. See section How can I getthe unique ID for the last row? [p 83]One can insert NULL for timestamp and auto_increment columns. This results in the current time

15

Page 16: My sql technical reference manual

/ the next number.Blob columns can’t be keys.When one groups on a blob only the first ’max_sort_length’ bytes are used See sectionLimitations of BLOB and TEXT types [p 21] .Deleted records are in a linked list and subsequent inserts will reuse old positions. To get smallerfiles one can use the isamchk utility to reorganise tables.Each null column takes 1 bit extra, rounded up to the nearest byte.The maximum record length can be calculated as follows: 1+ sum_of_column_lengths +null_columns/8 + number of variable length columns.In some cases an attribute may silently change after creation: VARCHAR columns with a length of1 or 2 are changed to CHAR. When using one VARCHAR column all CHAR columns longer than 2are changed to VARCHAR’s.On INSERT/UPDATE all strings (CHAR and VARCHAR) are silently chopped/padded to themaximal length given by CREATE. All end spaces are also automatically removed. For exampleVARCHAR(10) means that the column can contain strings with a length up to 10 characters.Something/0 gives a NULL value.The regular expression function (REGEXP and RLIKE) uses ISO8859-1 (Latin1) when decidingthe type of a character.ALTER TABLE syntaxALTER [IGNORE] TABLE table_name alter_specification [, alter_specification ...]alter_specification:ADD [COLUMN] create_definitionor CHANGE [COLUMN] old_column_name create_definitionor ALTER [COLUMN] column_name { SET DEFAULT literal | DROP DEFAULT }or DROP [COLUMN] column_nameor DROP PRIMARY KEYDROP INDEX key_nameALTER TABLE works by creating a temporary table and copying all information to it and thenthe old table is deleted and the new one is renamed. This is done in such a way that all updatesare automatically redirect to the new table without any failed updates. While the ALTER TABLEis working, the old table is readable for other clients. Table updates/writes to the table are stalled37and only executed after the new table is ready.

16

Page 17: My sql technical reference manual

If IGNORE isn’t specified then the copy will be aborted and rolled back if there exists anyduplicated unique keys in the new table. This is a MySQL extension.The CHANGE column_name, DROP column_name and DROP INDEX are MySQLextensions to ANSI SQL92.The optional word COLUMN is a pure noise word and can be omitted.The ADD and CHANGE takes the same create_definition as CREATE TABLE. See sectionCREATE TABLE syntax. [p 36] .ALTER COLUMN sets a new default value or removes the old default value for a column.DROP INDEX removes an index. This is an MySQL extension.The FOREIGN KEY syntax in MySQL exists only for compatibility with other SQL vendorsCREATE TABLE commands: It doesn’t do anything. See section How standards compatible areMySQL [p 19]If one drops a column_name which is part of some key, this key part is removed. If all key partsare removed then the key is removed.DROP PRIMARY KEY drops the first UNIQUE key in the table.CHANGE tries to convert data to the new format as good as possible.With mysql_info(MYSQL*) one can retrieve how many records were copied and how manyrecords were deleted because of multiple keys.To use ALTER TABLE one has to have select, insert, delete, update, create and drop privilegeson the table.DROP TABLE syntax.DROP TABLE table_name [, table_name....]Removes one or more tables. All the data and the definition is removed so take it easy with thiscommand!DELETE syntax.DELETE FROM table_name WHERE where_definitionReturns records affected.If one does a delete without a where clause then the table is recreated which is much faster than doinga delete for each row. In these cases, the SQL command returns zero as affected records.Using DELETE FROM table_name will work even if the data files do not exist as onlyinformation from the table definition file, table_name.frm, is used.All string comparisons are case independent with case according to ISO-8859-1 Latin1.LIKE is allowed on numerical columns.

17

Page 18: My sql technical reference manual

Compare with explicit NULL (column == NULL) is the same as if IS NULL was used (columnIS NULL). This is is done to be consistent with mSQL.38SELECT syntaxSELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,... [INTOOUTFILE ’file_name’ ...] [ FROM tables... [WHERE where_definition ][GROUP BY column,...] [ ORDER BY column [ASC | DESC] ,..] HAVINGwhere_definition [LIMIT [offset,] rows] [PROCEDURE procedure_name]]Strings are automatically converted to numbers and numbers to strings when needed (ala perl). If in acompare operation ((=, <>, <= ,<, >=, >)) either if the arguments are numerical thearguments are compared as numbers, else the arguments are compared as strings. All stringcomparisons are by default done case-independent by ISO8859-1 (The Scandinavian letter set whichalso works excellent with English).select 1 > "6x"; -> 0select 7 > "6x"; -> 1select 0 > "x6"; -> 0select 0 = "x6"; -> 1A column name does not have to have a table prefix if the given column name is unique.A select expression may be given an alias which will be column name and can be used whensorting and grouping or in the HAVING clause.select concat(last_name,’ ’,first_name) as name from table order by nameIn LIKE expressions % and _ may be preceded with ’\’ to skip the wild-card meaning.A DATE is a string with one of the following syntaxes:YYMMDD (Year is assumed to be 2000 if YY < 70.)YYYYMMDDYY.MM.DD Where ’.’ may be any non numerical separator.YYYY.MM.DD Where ’.’ may be any non numerical separator.IFNULL() and IF() returns number or string value according to use.ORDER and GROUP columns may be given as column names, column alias or column numbers inSELECT clauses.The HAVING clause can take any columns or alias in the select_expressions. It is applied last,just before items are sent to the client, without any optimisation. Don’t use it for items thatshould be in the WHERE clause. You can’t write (yet):SELECT user,MAX(salary) FROM users GROUP BY users HAVING max(salary)>10Change it to:

18

Page 19: My sql technical reference manual

SELECT user,MAX(salary) AS sum FROM users GROUP BY users HAVING sum > 10STRAIGHT_JOIN forces the optimiser to join the tables in the same order that the tables aregiven in the FROM clause. One can use this to get a query to be done more quickly if theoptimiser joins the tables in not optimal order. See section EXPLAIN syntax. Get informationabout a SELECT. [p 47]LIMIT takes one or two numerical arguments.If one argument, the argument indicates the maximum number of rows in a result.If two arguments, the first argument says the offset to the first row to return, the second is39the maximum number of rows.INTO OUTFILE ’filename’ writes the given set to a file. The file can not exist from before. Seesection LOAD DATA INFILE syntax [p 45] .FunctionsA select_expression or where_definition can consist of any expression using thefollowing functions:Group functions.() ParenthesisNormal mathematical operations.+-*/ A division by zero results in a NULL.Bit functions. These have a range of maximum 64 bits because MySQL uses longlong arithmetic.|&BIT_COUNT()Number of set bits in an argument.Normal logical. Returns TRUE (1) or FALSE (0).NOT!ORANDComparison operators. Returns TRUE (1) or FALSE (0). These functions work for both numbers andstrings.= Equal<> Not equal. Synonym: !=<= Smaller or equal.

19

Page 20: My sql technical reference manual

< Smaller.>= Bigger or equal> BiggerISNULL(A)Returns 1 if A is NULL else 0. Same as ’( A == NULL ’).A BETWEEN B AND CA is bigger or equal as B and A is smaller or equal to C. Is the same as (A >= B AND A <= C).40String comparison functions.expr IN (value,...)Returns 1 if expr is any of the values in the IN list, else it returns 0. If all values are constants,then all values are evaluated according to the type of expr and sorted. The search for them item isthen done by using a binary search. This means IN is very quick when used with constants in theIN part.expr LIKE exprSQL simple regular expression comparison. Returns TRUE (1) or FALSE (0). With LIKE youhave two wild characters. ’%’ stands for any number of characters, even zero characters. ’_’stands exactly one character. If you want to search after a ’%’ or a ’_’ you must precede it witha ’\’ For example the string "Monty was here" is matched by "Monty%", "%Monty ___ h%"and "%was%".expr NOT LIKE exprReturns TRUE (1) or FALSE (0).expr REGEXP exprChecks string against extended regular expr.expr NOT REGEXP exprChecks string against extended regular expr.STRCMP()Returns 0 if the strings are the same. Otherwise return -1 if first argument is smaller according tosort-order, otherwise it returns 1.Control flow functions.IFNULL(A,B)If A is not null it returns A, else B.IF(A,B,C)If A is true (<> 0 and <> NULL) then return B, else return C.Mathematical functions. These returns NULL in the case of a error.- SignABS()SIGN()Sign of argument. Returns -1, 0 or 1.

20

Page 21: My sql technical reference manual

MOD()% Module (like in C). Equivalent with MOD().FLOOR()CEILING()ROUND()EXP()LOG()LOG10()POW()SQRT()PI()COS()SIN()41TAN()TAN2()ACOS()ASIN()ATAN()RAND([integer_expr])Returns a random float, 0 <= x <= 1.0, using integer_expr as the option seed value.MIN()Min value of arguments. Must have 2 or more arguments, else these are GROUP BY functions.The arguments are compared as numbers.MAX()Max value of arguments. Must have 2 or more arguments, else these are GROUP BY functions.The arguments are compared as numbers.String functions.ASCII(string_exp)Returns the ASCII code value of the leftmost character of string_exp. If string_exp is NULL, itthen returns NULL.CHAR(num,...)Returns a string that consist of the characters given by the ASCII code values of the arguments.NULLS are skipped.CONCAT()Concatenates strings. May have more than 2 arguments.LENGTH()Length of string. Synomyes: CHAR_LENGTH(), OCTET_LENGTH()LOCATE(A,B)Returns position of B substring in A. The first position is 1. Returns 9 if b is not in A.LOCATE(A,B,C)Returns position of B substring in A starting at C. Synonym: POSITION(B IN A)

21

Page 22: My sql technical reference manual

LEFT(str,length)Gets length characters from beginning of string.RIGHT(str,right)Gets length characters from end of string. Synonym: SUBSTRING(A FROM B)LTRIM(str)Removes space characters from the beginning of string.RTRIM(str)Removes space characters from the end of string.TRIM([[ BOTH | LEADING | TRAILING] [ A ] FROM ] B)Returns a character string with all A prefixes and/or suffixes removed from B. If BOTH,LEADING and TRAILING isn’t used BOTH are assumed. If A is not given, then spaces areremoved.SOUNDEX(str)Gets a soundex string from str. Two strings that sound ’about the same’ should have identicalsoundex strings. A ’standard’ soundex string is 4 long, but this function returns an arbitrary longstring. One can use SUBSTRING on the result to get a ’standard’ soundex string. All non alphacharacters are ignored in the given string. All characters outside the A-Z range are treated asvocals.SUBSTRING(A,B,C)Returns substring from A starting at B with C chars.42SUBSTRING(A FROM B FOR C)Same as SUBSTRING(A,B,C). This is ANSI SQL 92.SUBSTRING(A FROM B)Same as RIGHT(A,B). This is ANSI SQL 92.SUBSTRING_INDEX(string,delimiter,count)Returns the substring from ’string’ after ’count’ delimiters. If count is positive the strings aresearched from left else if count is negative the substrings are searched and returned from right.substring("www.tcx.se",".",2) would return "www.tcx" andsubstring("www.tcx.se",".",-2) would return "tcx.se".REPLACE(A,B,C)Replaces all occurrences of B in A with C.REPEAT(string,count)Repeats string count times. If count <= 0 returns a empty string. If string or count is NULL orLENGTH(string)*count > max_allowed_size returns NULL.INSERT(org,start,length,new)Replaces substring org[start...length] with new. First position in string=1.LCASE(A)Changes A to lower case. Synonym: LOWER()

22

Page 23: My sql technical reference manual

UCASE(A)Changes a to upper case. Synonym: UPPER()ENUM(A,a,b,c,d)Returns 1 if A == a, 2 if A == b. If no match 0 is returned. A,a,b,c,d... are strings.ELT(N,a,b,c,d,...)Returns a if N == 1, b if N == 2. a,b,c,d are strings.FIELD(A,a,b,c,d,...)Returns index of A in the a,b,c... list. The complement of ELT().Date and time functions.PERIOD_ADD(P:N)Adds N months to period P (of type YYMM or YYYYMM). Returns YYYYMM.PERIOD_DIFF(A,B)Returns months between periods A,B. A and B should be of format YYMM or YYYYMM.Example: PERIOD_DIFF(9612,199712).TO_DAYS(DATE)Changes a DATE to a daynumber. DATE may be a date string, a datetime string, a timestamp([6 |8 | 14]) or a number of format YYMMDD or YYYYMMDD.FROM_DAYS()Changes a daynumber to a DATE.WEEKDAY(DATE)Gets weekday for date (0 = Monday, 1 = Tuesday). DATE may be a date string, a datetime string,a timestamp([6 | 8 | 14]) or a number of format YYMMDD or YYYYMMDD.CURDATE()Returns date of today. In form YYYYMMDD or "YYYY-MM-DD" depending on whetherCURDATE() is used in a number or string context. Synonymes: CURRENT_DATE().CURTIME()Returns current time in form HHMMSS or "HH:MM:SS", depending on whether CURTIME() isused in a number or string context. Synonymes: CURRENT_TIME().43NOW()Returns current time. In format YYYYMMDDHHMMSS or "YYYY-MM-DD HH:MM:SS"depending on whether NOW() is used in a number or string context. Synonymes:CURENT_TIMESTAMP(), SYSDATE().UNIX_TIMESTAMP([DATE])If called without any arguments a unix timestamp (seconds in GMT since 1970.01.01 00:00:00)is returned. Normally it is called with a timestamp column as an argument in which case it

23

Page 24: My sql technical reference manual

returns the timestamp. DATE may also be a date string, a datetime string, or a number of formatYYMMDD or YYYMMDD in local time.FROM_UNIXTIME(unix_timestamp)Returns a string of the timestamp in YYYY-MM-DD HH:MM:SS or YYYYMMDDHHMMSSformat depending on context.SEC_TO_TIME(seconds)Returns the hours, minutes and seconds of the argument in H:MM:SS or HMMSS formatdepending on context.Miscellaneous functions.DATABASE()Returns current database name.USER()Returns current user name. Synonymes: SESSION_USER() and SYSTEM_USER().PASSWORD()Calculates a password string. This must be used to store a password in the ’user’ grant table.ENCRYPT(string[,salt])Crypt messsage with the unix crypt() command. The salt should be a string with 2 characters.LAST_INSERT_ID()Returns the last automaticly generated value that was set in a auto_increment column. See sectionHow can I get the unique ID for the last row? [p 83]FORMAT(nr,NUM)Formats number to a format like ’#,###,###.##’ with NUM decimals.Functions for GROUP BY clause.count(expr)Number of rows. count(*) is optimised to return very quickly if no other column is used in theSELECT.avg(expr)Average value of expr.min(expr)max(expr)Minimum/Maximum value of expr. min() and max() may take a string argument and will thenreturn the minimum/maximum string value.sum(expr)Sum of expr.std(expr)Standard derivation of expression. This is a extension to ANSI SQL.bit_or(expr)The logical OR of all bits in expr. Caclulation done with 64 bits precision.44

24

Page 25: My sql technical reference manual

bit_and(expr)The logical AND of all bits in expr. Caclulation done with 64 bits precision.MySQL has extended the use of GROUP BY. You can use columns or calculations in the SELECTexpressions which doesn’t appear in the GROUP BY part. This stands for ’any possible value for thisgroup’. By using this, one can get a higher performance by avoiding sorting and grouping onunnecessary items. For example, in the following query one doesn’t need to sort on b.name:SELECT a.id,b.name,COUNT(*) from a,b WHERE a.id=b.id GROUP BY a.idINSERT syntaxINSERT INTO table [ (column_name,...) ] VALUES (expression,...)or INSERT INTO table [ (column_name,...) ] SELECT ....An expression may use any previous column in column_name list (or table if no column name list isgiven).The following holds for a multi-row INSERT statement:The query cannot contain an ORDER BY clause.The target table of the INSERT statement cannot appear in the FROM clause of the query.If one uses INSERT INTO ... SELECT ... then one can get the following info string withthe C API function mysql_info(). @result{Records: 100 Duplicates: 0 Warnings: 0}Duplicates are number of rows which couldn’t be written because some key would be duplicated.Warnings are columns which were set to NULL, but have been declared NOT NULL. These willbe set to their default value.If one sets a time stamp value to anything other than NULL, the time stamp value will be copiedto the result table.Auto increment fields works as usual.LOAD DATA INFILE syntaxLOAD DATA INFILE ’table_interval.text’ [REPLACE | IGNORE] INTO TABLEtable_interval [FIELDS [TERMINATED BY ’,’ [OPTIONALLY] ENCLOSED BY’"’ ESCAPED BY ’\\’ ]] [LINES TERMINATED BY ’\n’] [(field list)]This is used to read rows from a text file, located on the server, at a very high speed. The server-clientprotocol doesn’t yet support files over a connection. If you only have the file on the client, use rcp orftp to copy it, possibly compressed, to the server before using LOAD DATA INFILE.To write data to a text file, use the SELECT ... INTO OUTFILE ’interval.txt’ fieldsterminated by ’,’ enclosed by ’"’ escaped by ’\\’ lines terminatedby ’\n’ FROM .... syntax.

25

Page 26: My sql technical reference manual

Normally you don’t have to specify any of the text file type options. The default is a compact text filewith columns separated with tab characters and all rows end with a newline. Tabs, newlines and \inside fields are prefixed with a \. NULL’s are read and written as \N.45FIELDS TERMINATED BY has the default value of \t.FIELDS [OPTIONALLY] ENCLOSED BY has the default value of ".FIELDS ESCAPED BY has the default value of ’\\’.LINES TERMINATED BY has the default value of ’\n’.FIELDS TERMINATED BY and LINES TERMINATED BY may be more than 1 character.If LINES TERMINATED BY is an empty string and FIELDS TERMINATED BY is not empty thenlines are also terminated with FIELDS TERMINATED BY.If FIELDS TERMINATED BY and FIELDS ENCLOSED BY both are empty strings (") then thisgives a fixed row format ("not delimited" import format). With a fixed row size NULL values areoutputed as a blank string. If you specify OPTIONALLY in ENCLOSED BY, then only strings areenclosed in ENCLOSED BY by the SELECT ... INTO statement.Duplicated ENCLOSED BY chars are removed from strings that start with ENCLOSED BY. Forexample: With ENCLOSED BY ’"’:"The ""BIG"" boss" -> The "BIG" bossThe "BIG" boss -> The "BIG" bossIf ESCAPED BY is not empty then the following characters will be prefixed with the escapecharacter: ESCAPED BY, ASCII 0, and the first character in any of FIELDS TERMINATED BY,FIELDS ENCLOSED BY and LINES TERMINATED BY.If FIELDS ENCLOSED BY is not empty then NULL is read as a NULL value. If FIELDS ESCAPEDBY is not empty then \N is also read as a NULL value.If REPLACE is used, then the new row will replace all rows which have the same unique key. IfIGNORE is used, the row will then be skipped if there already exist a record with an identical uniquekey. If none of the above options are used an error will be issued. The rest of the text file will beignored if one gets a duplicate key error.Some possible cases that’s not supported by LOAD DATA:Fixed size rows (FIELDS TERMINATED BY and FIELDS ENCLOSED BY both are empty)and BLOB fields.If some of the separators are a prefix of another.

26

Page 27: My sql technical reference manual

FIELDS ESCAPED BY is empty and the data contains LINES TERMINATED BY or FIELDSENCLOSED BY followed by FIELDS TERMINATED BY.All rows are read into the table. If a row has too few fields the rest of the fields are set to defaultvalues.For security reasons the text file must either reside in the database directory or be readable by all.For more information about the escaped syntax See section Literals. How do you write strings andnumbers? [p 30] .46When the LOAD DATA query is done, one can get the following info string with the C API functionmysql_info().@result{Records: 1 Deleted: 0 Skipped: 0 Warnings: 0}Warnings are incremented for each column which can’t be stored without loss of precision, for eachcolumn which didn’t get a value from the read text line (happens if the line is too short) and for eachline which has more data than can fit into the given columns.Example that loads all fields;LOAD DATA INFILE ’persondata.text’ INTO TABLE persondata;See section How should I arrange my table to be as fast/small as possible? [p 59]UPDATE syntaxUPDATE table SET column=expression,... WHERE where_definitionAll updates are done from left to right. If one accesses a column in the expression update will then usethe current value (a given value or the default value) of the column.UPDATE persondata SET count=count+1SHOW syntax. Get information about names of columns.SHOW DATABASES [LIKE wild]or SHOW TABLES [FROM database] [LIKE wild]or SHOW COLUMNS FROM table [FROM database] [LIKE wild]Gives information about databases, tables or columns. The wild is a LIKE string. FIELDS may beused as an alias for COLUMNS.EXPLAIN syntax. Get information about a SELECT.EXPLAIN SELECT select_optionsGives information about how and in which order tables are joined. With the help of EXPLAIN one cansee when one has to add more keys to tables to get a faster select that uses keys to find the records.You can also see if the optimiser joins the tables in an optimal order. One can force the optimiser touse a specific join order with the STRAIGHT_JOIN option to select.The different join types are:

27

Page 28: My sql technical reference manual

systemThe table has only 1 record (= system table)constThe table has at most 1 matching record which will be read at the start of the query. All columnsin this table will be regarded as constants by the rest of the optimiser.eq_refOne record will be read from this table for each combination of the previous tables.47refAll records with matching keys will be read from this table for each combination of the previoustables.allA full table scan will be done for each combination of the previous tables.DESCRIBE syntax. Get information about columns.(DESCRIBE | DESC) table [column]Gives information about columns. This command is for Oracle compatibility. See section SHOWsyntax. Get information about names of columns. [p 47] Column may be a column name or a string.Strings may contain wild cards.Lock tables syntaxLOCK TABLES table_name [AS alias] READ|WRITE [, table_name READ|WRITE ] ...UNLOCK TABLESLocks tables for this thread. Many threads may have a READ lock on the same table, but one can usea table with a WRITE lock. One can’t update a table on which one has a read LOCK. When one usesLOCK TABLES one must lock all tables one is going to use!LOCK TABLES t READ, t as t2 READSELECT * from t,t2;All tables are automaticly unlocked when one issues another LOCK TABLES or if the connection tothe server is closed.SET OPTION syntax.SET OPTION SQL_VALUE_OPTION=value, ...The used options remain in effect for the whole current session.The different options are:SQL_SELECT_LIMIT=valueThe maximum number of records to return in any select. If a select has a limit clause it overridesthis statement. The default value for a new connection is ’unlimited’.SQL_BIG_TABLES= 0 | 1If set to 1 then all temporary tables are stored on disk based. This will be a little slower, but one

28

Page 29: My sql technical reference manual

will not get the error The table ### is full anymore for big selects that require bigtemporary tables. The default value for a new connection is 0 (use in memory temporary tables).SQL_BIG_SELECTS= 0 | 1If set to 1 then MySQL will aborts if one will try to make a select with probably will take a verylong time. This is nice to SELECTS with a wrong WHERE statement. A big query is defined as aSELECT that will probably have to examine more than max_join_size rows. The defaultvalue for a new connection is 0 (allow all SELECT’s).48GRANT syntax. (Compatibility function).GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE,REFERENCES (column list), USAGE))ON table TO user,... [WITH GRANT OPTION]This command doesn’t do anything. It is only in MySQL for compatibility reasons. Privileges inMySQL is handled with the mysql grant tables. See section How does the privilege system work? [p26]CREATE INDEX syntax (Compatibility function).CREATE [UNIQUE] INDEX index_name ON table_name ( column_name,... )This function doesn’t do anything. It is only in MySQL for compatibility reasons. You can create newindex with ALTER TABLE. See section ALTER TABLE syntax [p 37]DROP INDEX syntax (Compatibility function).DROP INDEX index_nameThis always succeeds. You can drop an index with ALTER TABLE. See section ALTER TABLEsyntax [p 37]Is MySQL picky about reserved words?It seems that I can’t create a table with column names timestamp or group.Functions don’t clash with table or column names. (For example ABS is an allowed column name).The only restriction is that space is not allowed between a function name and the ’(’ when usingfunctions.The following are reserved words in MySQL. Most of them (for example) group, are forbidden byANSI SQL92 as column and/or table names. A few are because MySQL needs them and is (currently)using a Yacc parser:49action add all alter andas asc auto_increment between bigintbit binary blob both by

29

Page 30: My sql technical reference manual

cascade char character change checkcolumn columns create data databasesdate datetime dec decimal defaultdelete desc describe distinct doubledrop escaped enclosed enum explainfields float float4 float8 foreignfrom for full grant grouphaving ignore in index infileinsert int integer interval int1int2 int3 int4 int8 intois key keys leading likelines limit lock load longlongblob longtext match mediumblob mediumtextmediumint middleint numeric no notnull on option optionally ororder outfile partial precision primaryprocedure privileges read real referencesregexp repeat replace restrict rlikeselect set show smallint sql_big_tablessql_big_selects sql_select_limit straight_join table tablesterminated text time timestamp tinyblobtinytext tinyint trailing to uniqueunlock unsigned update usage valuesvarchar varying with write wherezerofillThe following symbols (from the table above) are disallowed by ANSI SQL but allowed by MySQLas column/table names. This is because some of theese names are very natural names so a lot ofpeople has already used them.ACTIONBITDATE50ENUMNOTEXTTIMETIMESTAMPGo to the first [p 5] , previous [p 26] , next [p 52] , last [p 87] section, table of contents [p 1] .51Go to the first [p 5] , previous [p 30] , next [p 57] , last [p 87] section, table of contents [p 1] .How safe/stable is MySQLHow stable is MySQL?At TcX, MySQL has worked without any problems in our projects since nid 1996. When released to a

30

Page 31: My sql technical reference manual

wider public we noticed that there where some parts of ’untested code’ in MySQL that was quicklyfound by the new user group that don’t do queries exactly like we do at TcX. Each new release havehad fewer non portability problems than the previous one, even though they have had a lot of newfeatures, and we hope that one of the next releases will be possible to be labelled ’stable’.Each release of MySQL has been usable and there has only been problems when users start to usecode from ’the gray zones’. Naturally, outdoor users can’t know what the gray zones are and I hopethis section will clarify those currently known.We will here try to answer some of the more important questions that seems to concern a lot of peopleand clarify some issues. This section has been put together from the information that has comeforward in the mailing list which is very active in reporting bugs.How stable is MySQL? Can I depend on MySQL in this project!This is about the 3.21.x version of MySQL. All known and reported bugs are fixed in the latestversion with the exception of the bugs listed in the BUGS file which are things that are ’design’related.MySQL is written in multiple layers and different independent modules. Here is a list of the differentmodules and how tested each of them are.The ISAM table handler. Stable(ISAM) where all data is stored. In all MySQL releases there hasn’t been a single (reported) bugin this code. The only known way to get a corrupted table is to kill the server in the middle of aupdate and because all data is flushed to disk between each query even this is unlikely to destroyany data beyond rescue. There hasn’t been a single bug report about lost data because of bugs inMySQL either.The parser and lexical analyser. StableThere hasn’t been a single reported bug in this system for a couple of months.The C client code. StableNo known problems. In early 3.20 releases there were some limitations in the send/receive buffersize. In 3.21.x the send/receive buffer is now dynamic up to a default of 512K.mysql, mysqladmin and mysqlshow. StableThe command line clients have had very few bugs.mysqldump and mysqlimport. Beta

31

Page 32: My sql technical reference manual

Rewritten for 3.21.Basic SQL. StableThe basic SQL function system and string classes and dynamic memory handling. Not a singlereported bug on this system.52Query optimiser. GammaSome changes in 3.21.Range optimiser. AlphaTotally rewritten for 3.21.xJoin optimiser. GammaSmall changes for 3.21.GROUP BY, ORDER BY and related function COUNT(). BetaRewritten for 3.21 and throughly tested.Locking. GammaThis is very system dependent. One some system there is big problems to use standard OSlocking (fcntl). In these case one should run the MySQL demon with the --skip-locking flag.Known problems are some Linux systems and SUNOS when using NFS mounted file systems.Linux threads. GammaThe only found problem is with the fcntl() call, which is fixed by using --skip-locking. Somepeople have reported lockup problems with the 0.5 release.Solaris 2.5+ pthreads. StableWe use this for all our production work.MIT threads (Other systems). BetaNo reported bugs since 3.20.15 and no known bugs since 3.20.16. On some system there is’misfeature’ where some operations are quote slow (a 1/20 second sleep is done between eachquery).Other thread implementions. AlphaThe ports to other systems is very new and may still have bugs, either in MySQL or most oftenin the thread implementation itself.LOAD DATA..., INSERT ... SELECT. StableSome people have thought they have found bugs in this but has turned up beingmisunderstandings. So check the manual before reporting bugs!ALTER TABLE. GammaPartly rewritten for 3.21.mysqlperl. StableNo bugs reported except a lot of compiling and linking problems.DBD. BetaNow maintained by Jochen Wiedmann . Thanks!mysqlaccess. Beta

32

Page 33: My sql technical reference manual

Written and maintained by [email protected]. Thanks!The Technical Documentation. BetaIt is improving.MyODBC (uses ODBC SDK 2.5). BetaIt seams to work well with some programs. There is some known problems with Office97.PowerBuilder doesn’t work yet. Error messages aren’t returned right when using a MicrosoftNew ODBC 3.0 driver but this may well be a bug in the Microsoft ODBC 3.0 driver. It isn’t fullyup to ODBC level 2 yet in every regard. (My personal opinion is that the ODBC levels aredefined in such a way that it’s almost impossible to make a simple ODBC driver that works withall products). Sometimes the MyODBC code must be ported to ODBC 3.0.TcX provides email support for paying customers, but the MySQL mailing list usually providesanswers to all common questions. Bugs are usually fixed right away with a patch that usually worksand for serious bugs there is almost always a new release.53Why are there is so many release of MySQL? Is it becausethere are so many bugs?Well, MySQL is evolving quite rapidly here at TcX and we want to share this with other MySQLusers. We try to make a release when we have a very useful feature that others seem to have a needfor.We also try to help out users who request features that are easy to implement. We also take note onwhat our licensed users want to have and we especially take notes on what our extended emailsupported customers want and try to help them out.No one has to download a new release. The NEWS file will tell you if the new release has somethingyou really want.If there is, by any chance, a fatal bug in a release we will make a new release as soon as possible, thatfixes the problem. We would like other companies to do this too :)The 3.21.x version has had many big changes for portability to a lot of different systems. When the3.21 release is stable we will remove the alpha/beta suffix and move active development to the 3.22.Bugs will still be fixed in the stable version. We don’t believe in a complete freeze, as this also leavesout bug fixes and things that ’must be done’. ’Somewhat freezed’ means that we will maybe add smallthings that ’almost surely will not affect anything thats already working’.

33

Page 34: My sql technical reference manual

Checking a table for errors.If MySQL crashed (for example if the computer is turned off) when all data is not written to disk thetables may have become corrupted. To check a table use:isamchk table_nameThis finds 99.99 % of all errors. What it can’t find is when only the data file has been corrupted.isamchk -e table_nameThis goes through all data and does a complete check.isamchk -ei table_nameAs the above but it also prints some statistics.We at TcX run a cron job on all our important tables once a week.35 0 * * 0 /path/to/isamchk -s /path/to/dbs/*/*.ISMThis prints out any crashed tables so we can go and examine and repair them when needed.As we haven’t had any unexpected crashed (without hardware trouble) tables for a couple of yearsnow (this is really true), once a week is more than enough of us.Of course, whenever the machine has done a reboot in the middle of a update one usually has to checkall the tables that could have been affected. (This is a ’expected crashed table’)We recommend that to start with one should do a isamchk -s on all updated tables each night untilone gets to trust MySQL as much as we trust it.54Naturally, one could add a check to safe_mysql that, if there is an old pid file left after a reboot, itshould check all tables that have been modified the last 24 hours.How to repair tables.The file format that MySQL uses to store data has been extensively tested, but there is alwaysinstances (like a hard kill on the mysqld process in the middle of a write, a hardware error or aunexpected shutdown of the computer) when some tables may be corrupted.The sign of a corrupted table is usually when queries abort unexpectedly and one gets errors like:table.frm is locked against change.Can’t find file ’table.ISM’ (Errcode: ###)Got error ### from table handler. (Error 135 is an exception in this case)Unexpected end of file.Record file is crashed.In thess cases you have to repair your tables. The isamchk extern utility can usually detect and fixmost things that can go wrong. See section The MySQL table check, optimize and repair program [p66] .

34

Page 35: My sql technical reference manual

If you are going to use isamchk on very large files, you should first decide how much memory youwant to give to isamchk. More memory gives more speed. For example, if you have more than 32Mram, try:isamchk -O sortbuffer=16M -O keybuffer=16M -O readbuffer=1M-O writebuffer=1M .....Part 1; CheckingCheck the permissions of the table files. Make them readable for the user running mysqld.cd to the database directory.Run ’isamchk *.ISM’ or (’isamchk -e *.ISM’ if you have more time).You only have to repair those tables that your isamchk gives an error. Use option -s to avoidunnecessary information.Part 2; Easy safe repair.If you get weird errors when checking or repairing, like out of memory or if isamchkcrashes, go to part 3.Try first ’isamchk -rq table’. This will try to repair the .ISM file without touching theimportant data table (.ISD). If the data file (.ISD) contains everything and the delete linkspoint at the right places in the data file, this should work and the table is fixed. Startrepairing next table.Make a backup of the data file (table.ISD) before continuing.Use ’isamchk -r table’. This will remove wrong records and deleted records from the datafile and reconstruct the index (.ISM) file.If the above fails, use ’isamchk -ro table’. This is a little slower but a crash-safer version ofthe above.Part 3; Hard repair.This should only happen if the first 16K block in the .ISM file is destroyed, contains wronginformation or if the .ISM is missing.In this case we have to create a new .ISM file. Do as follows:55Move the data file .ISD file to some safe place.Recreate the .ISM file from the .frm file:shell> mysql databasemysql> delete from table_name;mysql> quiteCopy (don’t move) the data file (.ISD) back on the newly created .ISD fileGo back to Part 2. (This shouldn’t be a endless loop). isamchk -rq should now work.Part 4; Very hard repair.

35

Page 36: My sql technical reference manual

This can only happen if the descriptor file (.frm) also has crashed. This should never happen,because the .frm file isn’t written to after the table is created.Restore the .frm file from a backup and go back to Part 3. You can also restore the .ISM fileand go back to Part 2. In the latter case you should start with ’isamchk -r’.If you don’t have a backup but know exactly how the table was created, create a copy of thetable in another database and copy the .frm and .ISM file from there to your crasheddatabase and go back to Part 2;Is there anything special to do when upgrading/downgradingMySQL?One can always move the MySQL form and data files between different versions on the samearchitecture as long as one has the same base version of MySQL. The current base version is of course3. If one changes the sort order by recompiling MySQL one has to do a isamchk -rq on the tables.Go to the first [p 5] , previous [p 30] , next [p 57] , last [p 87] section, table of contents [p 1] .56Go to the first [p 5] , previous [p 52] , next [p 65] , last [p 87] section, table of contents [p 1] .How to get maximum performance out of MySQLHow does MySQL use memory ?You can get the currently used buffer sizes with:> ./mysqld --helpThis should result in a list of all mysqld options and configurable variables like the following. Seesection How can I change the buffer sizes of mysqld ? [p 61] .Possibly variables to option --set-variable (-O) are:back_log current value: 5join_buffer current value: 131072key_buffer current value: 1048568max_allowed_packet current value: 65536max_connections current value: 90max_join_size current value: 4294967295max_sort_length current value: 1024net_buffer current value: 8192record_buffer current value: 131072table_cache current value: 64tmp_table_size current value: 131072sort_buffer current value: 2097144All threads share the same base memory.Nothing is memmaped yet (except compressed tables but that’s another story). This is because

36

Page 37: My sql technical reference manual

32bit memory space of 4GB is not large enough for most large tables. When we get a systemwith 64 bit address space we may add general support for memmaping.When starting mysqld one can specify a key buffer. This will buffer all keys in all tables atFIFO basis (variable keybuffer).Each connection uses some thread space, a stack and a connection buffer (variablenet_buffer_length).Each request doing a sequential scan over a table allocates a read buffer (variable record_buffer).Each request doing a sort, allocates a sortbuffer and one or two temporary files. The maximumextra disk-space needed is @math{(sort_key_length +sizeof(long))*2}.All joins are done in one pass and most temporary tables are memory based (HEAP) tables.Temporary tables with a big recordlength (= sum of all column length) or that contains BLOB’sare stored on disk. One current problem is that if the HEAP table exceeds the size oftmp_table_size, one will get the error: ’The table ### is full’. In the future we will fix thisby automatically changing the in memory (HEAP) table to a disk based (NISAM) table if needed.To go around this problem one can increase the -O tmp_table_size=# option to mysqld oruse the SQL option SQL_BIG_TABLES. See section SET OPTION syntax. [p 48] . In MySQL3.20 the maximum size of the temporary table was recordbuffer*16, so if you are using thisversion you have to increase recordbuffer. There also exists a patch to always storetemporary tables on disk, but this will affect the speed of all complicated queries.Almost all memory used when parsing and calculating is done on a local memory store. Nomemory overhead is needed for small items and the normal slow memory allocation/freeing isavoided. Memory is only allocated for unexpectedly large strings (this is done with malloc/free).57Each index file is opened once and the data file is opened once for each concurrently runningthread. For each concurrent thread a table structure, column structures for each column and abuffer that has the size of 3 * (maximum row length not counting BLOBS) is allocated. A BLOBuses 5 to 8 bytes +length of blob data.

37

Page 38: My sql technical reference manual

For each table having BLOBS, a buffer is enlarged dynamically to read in larger BLOB’s. If onescans a table there will be a allocated buffer as large as the largest BLOB.All used tables are saved in a cache and used by FIFO. Normally the cache is 64 tables. If a tablehas been used by 2 running threads at the same time, there will be 2 entries of the table in thecache.A MySQLadmin refresh closes all tables that are not used and marks all used tables to beclosed when the running thread finishes. This will effectively free most used memory.When running mysqld ps, other programs may report that is takes a lot of memory. This may becaused by thread-stacks on different memory addresses. For example, the Solaris ps calculates theunused memory between stacks as used memory. You can verify this by checking available swap with’swap -s’. We have tested mysqld with commercial memory-leakage detectors so there should not beany memory leaks.How does MySQL use keys?All keys, PRIMARY, UNIQUE and INDEX(), are stored in B trees. Strings are automatically prefixandend-space compressed.INDEX(col1, col2) creates a multiple index over the two columns. The key can be seen like aconcatenation of the given columns. If you use INDEX(col1), INDEX(col2) instead ofINDEX(col1,col2) you get two separate keys instead.SELECT * FROM table WHERE col1=# AND col2=#In a case of INDEX(col1,col2) the right row(s) can be fetched directly. In a case of INDEX(col1),INDEX(col2) the optimiser decides which index will find fewer rows and this index will be used tofetch the rows.If the table has an index INDEX(col1,col2,col3....) the prefix of this can be used by the optimiser tofind the rows. This means that the above gives you search capabilities on: INDEX(col1) andINDEX(col1,col2) and INDEX(col1,col2,col3)...MySQL can’t use a sub part of a key to locate rows through a key.With the definition INDEX(col1,col2,col3):SELECT * FROM table WHERE col1=#SELECT * FROM table WHERE col2=#SELECT * FROM table WHERE col2=# and col3=#only the first query will use keys.58

38

Page 39: My sql technical reference manual

How does MySQL open & close tables?The cache of open tables can grow to a maximum of table-cache (default 64, changeable with -Otable_cache=#). A table is never closed, except when the cache is full and another thread tries to opena table or if one uses ’mysqladmin refresh’.When the limit is reached, MySQL closes as many tables as possible, until the cache size has beenreached or there are no more unused tables. This means that if all tables are in use by some threads,there will be more open tables than the cache limit, but the extra tables will be closed eventually.Tables are closed according to last-used order.A table is opened (again) for each concurrent access. This means that if one has two threads runningon the same table or access the table twice in the same query (with AS) the table needs to be openedtwice. The first open of any table takes 2 file descriptors, each following use of the table takes onlyone file descriptor.How should I arrange my table to be as fast/small as possible?Use NOT NULL if possible. It makes everything faster and you save 1 bit per column.All columns have default values. Only insert when the default value isn’t acceptable. You don’thave to insert the columns of a timestamp or an autoincremented key in the insert statement. Seesection How can I get the unique ID for the last row? [p 83]Use the smaller INT types if possible to get smaller tables. For example, MEDIUMINT is oftenbetter than INT.If you don’t have any VARCHAR columns, a fixed size record format will be used. This is muchfaster but may unfortunately waste some space. See section What are the different row formats?Or when to use VARCHAR/CHAR? [p 63] .To make MySQL optimise queries better, run isamchk -a on the table once it is loaded withrelevant data. This updates a value for each index that tells how many rows that have the samevalue for this key in average. Of course, this is always 1 for unique indexes.To sort an index and data according to an index use isamchk -Sir1 (if you want so sort onindex 1). If you have a unique key that you want to read all records from in numeric order this isa good way to make that faster.When loading a table with data use LOAD DATA FROM INFILE. This is usually 20 times

39

Page 40: My sql technical reference manual

faster than using a lot of INSERTs. If the text file isn’t on the server, rcp it to the server first. Seesection LOAD DATA INFILE syntax [p 45] . You can even get more speed when loading data totables with many keys by doing:Create the table in mysql or perl with CREATE TABLE....Do a mysqladmin refresh.Use isamchk -k0 database/table_name. This will remove all use of keys fromthe table.Insert data into the table with LOAD DATA INFILE....If you have pack_isam and want to compress the table, run pack_isam on it.Recreate the keys with isamchk -rq database/table_name.Do mysqladmin refresh.The other possibility to get some more speed to both LOAD DATA FROM INFILE andINSERT is to enlarge the key buffer. This can be done with the -O key_buffer=# option to(safe)mysqld. For example 16M should be a good value if you have much RAM :)When dumping data as textfiles to other programs, use SELECT ... INTO OUTFILE. See59section LOAD DATA INFILE syntax [p 45] .When doing many inserts/updates in a row, you can get more speed by using LOCK TABLES onthe tables. ...FROM INFILE... and ...INTO OUTFILE... are atomic so you don’t haveto use LOCK TABLES when using these. See section Lock tables syntax [p 48] .To check how you are doing, run isamchk -evi on the .ISM file.What affects the speed of the INSERT statement?The time to insert a record consists of:Connect: (3)Sending query to server: (2)Parsing query: (2)Inserting record: (1 x size of record)Inserting keys: (1 x keys)Close: (1)Where (number) is proportional time. This does not take into calculation the initial overhead to opentables (which is done once for each simultaneous running query).The size of the table slows down the insert of keys with N log N (B-trees).What affects the speed of DELETE statement?The delete time of a record is exactly proportional to the number of keys. To increase the seed ofdeletes you can increase the size of the key cache. The default key cache is 1M and to get faster

40

Page 41: My sql technical reference manual

deletes it should be increased a couple of times (try 16M if you have enough memory).What kind of optimisation is done on the WHERE clause?(Incomplete, MySQL does a lot of optimisations.)Brace removal (all unnecessary braces are removed). ((a AND b) AND c OR (((a ANDb) AND (c AND d)))) -> (a AND b) OR (a AND b AND c AND d)Constant folding. (a<b AND b=c) AND a=5 -> b>5 AND b=c A=5Constant condition removal (needed because of constant folding). (b>=5 AND b=5) OR(b=6 and 5=5) or (B=7 and 5=6) -> B=5 or B=6All constant expressions used by keys are evaluated only once.Return zero rows if impossible select.HAVING is merged with WHERE if one doesn’t use GROUP BY or group functions.For each sub join a simpler WHERE is constructed to get a fast WHERE evaluation for each subjoin and also to skip records as soon as possible.Find all keys that may be used. Use the key which finds least records. A key is used for thefollowing cases: =, >, >=, <, <=, BETWEEN and a LIKE with a character prefix like’something%’.Remove keys that don’t span all AND levels.have all preceding key_parts specified.key = 1 or A = 10 -> NULL (can’t use key.)60key = 1 or A = 10 and key=2 -> key = 1 OR key = 2key_part_1 = const and key_part_3 = const -> key_part_1 = constRead all constant tables. A constant table is:1. A table with 0 or 1 record.2. A table which uses only other const tables and constants on a full unique key.const_table.key = constant const_table.key_part_1 =const_table2.column and const_table.key_part_2 = constantFind the best join combination to join the tables, by trying all possibilities :(. If all columns inORDER BY and in GROUP comes from the same table, then this table is preferred first whenjoining.If there is a order clause and a different group clause or if the order or group contains columnsfrom other tables than the first table in the join cue, a temporary table is created.For each table use a ranged key, if possible, to read records. Each table index is queried and ifthere exists a key range that spans < 30% of the records then a key is used. If no such key can be

41

Page 42: My sql technical reference manual

found a quick table scan is used.Before each record is output-ed, skip those that match the HAVING clause.How can I change the buffer sizes of mysqld ?With the mysqld -O variable=size command. Example run:> mysqld --help (or > mysqld -?)>mysqld --help/my/monty/sql/mysqld Ver 3.21.0-alpa for SOLARIS 2.5 (SPARCstation)TcX Datakonsult AB, by Monty. This is FPL, not free softwareThis software comes with NO WARRANTY: see the file PUBLIC for details.Starts the mysql serverUsage: /my/monty/sql/mysqld [OPTIONS]-b, --basedir=path path to installation directory-h, --datadir=path path to the database root-#, --debug=... output debug log. Often this is ’d:t:o,filename‘-T, --debug-info print some debug info at exit-?, --help display this help and exit-L, --language=... client error messages in given language-l, --log[=filename] log connections and queries to file--log-update[=filename]log updates to filename.# where # is a unique numberif not given.--log-isam[=filename]log all isam changes to file-P, --port=... Port number to use for connection-O, --set-variable var=optiongive a variable an value. --help lists variables--skip-new-routines don’t use new possible wrong routines.--skip-grant-tables start without grant tables. This gives anyone FULLACCESS to all tables!--skip-locking don’t use system locking. To use isamchk one hasto shut down the server.--skip-name-resolve Don’t resolve hostnames.All hostnames are IP’s or ’localhost’--skip-new-routines don’t use new possible wrong routines.--skip-unsafe-select skip unsafe select optimisations.61--socket=... Socket file to use for connection-V, --version output version information and exitCurrent base_dir: /my/montyCurrent data_dir: data/Current language: english/Possibly variables to option --set-variable (-O) are:back_log current value: 5join_buffer current value: 131072key_buffer current value: 1048568max_allowed_packet current value: 65536max_connections current value: 90max_join_size current value: 4294967295

42

Page 43: My sql technical reference manual

max_sort_length current value: 1024net_buffer current value: 8192record_buffer current value: 131072table_cache current value: 64tmp_table_size current value: 131072sort_buffer current value: 2097144> safe_mysqld -O key_buffer=512k -O sort_buffer=100k -O record_buffer=100k &The key_buffer is shared by all threads, the rest are allocated when needed.mysqld demon starts with a cd to ’mysql-data-dir’. After this, mysqld-data-dir is changed to ’./’(current dir). All paths (databases, pid file, and log file) are prefixed with ’./’.What options to use to get MySQL to run at full speed?More memory gives more speed. You can try something like:mysqld -O key_buffer=16m -O sort_buffer=1m -O record_buffer=512k--skip-locking--skip-locking disables file locking between SQL requests. If this is used then the following canhappen:If mysqld or the machine crashes a table has a higher risk of being corrupted. Tables should atleast be checked with isamchk *.ISM after a crash.One MUST flush all tables with mysqladmin refresh before one tries to check/repair tableswith isamchk. (isamchk -d table_name is always allowed).The --skip-locking is default when compiling with MIT threads. This is because flock() isn’tfully support by MIT threads on all platforms.How to get MySQL to run as fast as possible with littlememory?If there are very many connections, ’swapping problems’ may occur, unless mysqld hasn’t beenconfigured to use very little memory for each connection.62For example, for 200 open connections one should have a table cache of at least 200 * (max_numberof tables in join).Of course MIT threads may slow down everything a bit, but for key based selects a select is usuallydown in one time frame so there shouldn’t be a mutex locking/thread juggling.If updates are a problem, updates can be delayed and then do many updates in a row later. Manyupdates done in a row are much quicker than one at a time.If the problem is with MIT threads and one is using FreeBSD x.x. upgrading to FreeBSD 3.0.(orhigher:) should help. This gives a possibility to use sockets (quicker than the current TCP/IP with MIT

43

Page 44: My sql technical reference manual

threads) and the thread package is much more integrated.What are the different row formats? Or when to useVARCHAR/CHAR?Actually using no VARCHAR or BLOB types results in a fixed row size. Otherwise CHAR andVARCHAR are the same.You can check the format used in a table with isamchk -d.MySQL has three different table formats:1. Fixed length tables;This is the default format.All non packed columns are space filled.Very quick.Easy to cash.Easy to reconstruct if crashed, of course, this only theoretical :-) as records are in fixedpositions.Don’t have to be reorganised unless a huge number of records are deleted.2. Dynamic tablesIs used if there exists any VARCHAR, TEXT or BLOB columns in a table.All strings are dynamic (except if length < 3).Each record is preceded with a bitmap for which columns are not empty (this isn’t the sameas null columns).Each string is saved with a length byte + string. If string is zero length or a number is zero ittakes no extra space, just the zero length bit for each column.Each record is uses the exact record space required. If a record becomes larger it is split intoas many pieces as required.Takes little disk space.If records are changed a lot, isamchk -r should be run now and then to reorganise thetable. This is to get a better layout. Use isamchk -ei table_name for some statistics.Not as easy to reconstruct because a record may be in many pieces and a link may bemissing.The expected row length for dynamic sized records is: 3 + (number_of_columns + 7) / 8 +(number of char columns) + packed_size_of_number_columns + length_of_strings +(null_columns + 7) / 8. There will be a penalty of 6 bytes for each link. A dynamic recordwill be linked whenever a update causes a enlargement of the record. Each new link will be63at least 20 bytes, so the next enlargement will probably go in the same link. If not, there will

44

Page 45: My sql technical reference manual

be another link. You may check how many links there are with isamchk -ed. All linksmay be removed with isamchk -r.3. Compressed tables (this is only with UNIREG/pack_isam)Read only tables.Takes very little disk space. Minimises disk usage.Each record is compressed separately (very little access overhead).Can handle fixed or dynamic length records, but no BLOBs.Can be uncompressed with isamchk.Why so many open tables?When you run mysqladmin status you get something like:Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12This can be somewhat perplexing if you only have 6 tables.As MySQL is multithreaded it may have many queries on the same table at once. To minimise theproblem with two threads having different states on the same file, I open the table again for eachconcurrent thread. This takes some memory and one extra file descriptor for the data file. The indexfile descriptor is shared all threads.Go to the first [p 5] , previous [p 52] , next [p 65] , last [p 87] section, table of contents [p 1] .64Go to the first [p 5] , previous [p 57] , next [p 75] , last [p 87] section, table of contents [p 1] .MySQL UtilitesOverview of the different MySQL programsAll MySQL client that communicates with the server uses the following environment variables:Name DescriptionMYSQL_UNIX_PORT The default socket. Used with ’localhost’.MYSQL_TCP_PORT The default TCP port.MYSQL_PWD The default password.mysqlA SQL shell (with gnu readline). Supports interactive use or as a non interactive query tool.When used interactively result is given in a ascii-table format, but when used as a filter the resultis a tab-separated output.mysqlaccessScript to check the privileges for a host, user and database combination.mysqladminAdministration utility. Create/Drop of databases, reload (read new users) and refresh (flush tablesto disk, reopen log files). Also gives version and process info.mysqldThe SQL daemon. This should always be running.

45

Page 46: My sql technical reference manual

mysqldumpDump a MySQL database into a file with SQL statements or tab separated text files. Enchantedfreeware originally by Igor Romanenko.mysqlimportImports text-file(s) into respective table(s). Can use all formats supported by LOAD DATAINFILE. See section LOAD DATA INFILE syntax [p 45]mysqlshowShows information about database, tables, fields and keys.mysqlbugThis script should always be used when filing a bug report to the MySQL list.mysql_install_dbCreates the MySQL grant tables with default privileges. This is usually only executed wheninstalling the first MySQL release on a new system.isamchkCheck, optimise and repair MySQL tables.make_binary_releaseMakes a binary release of a compiled MySQL. This could be sent by ftp towww.tcx.se/pub/mysql/Incoming for the convenience of other MySQL users.msql2mysqlA shell script to convert a mSQL program to MySQL. Doesn’t handle all cases but gives a goodstart when converting.65replaceBinary used for msql2mysql. Utility program to change strings in place in files or on stdin. Usesa finite state machine to match longer strings first. Can be used to swap strings, for example’replace a b b a -- files’ swaps ’a’ and ’b’ in the given files.safe_mysqldStarts the mysqld demon with some safety features. Restarts on error and has logging of runtimeinformation to a log file.The MySQL table check, optimize and repair programFor infromation about how to use isamchk to repair a crached table: See section How to repair tables.[p 55] .Getting low level table informationTo get a description/statistics from a table use the forms below. We will explain some of theinformation in more detail later.isamchk -d table_nameisamchk in ’describe mode’. If one uses ’--skip-locking’ isamchk may report an error for a table

46

Page 47: My sql technical reference manual

that is updated while isamchk runs, but there isn’t any risk of destroying data. A short form.ISAM file: company.ISMData records: 1403698 Deleted blocks: 0Recordlength: 226Record format: Fixed lengthtable description:Key Start Len Index Type1 2 8 unique double2 15 10 multip. text packed stripped3 219 8 multip. double4 63 10 multip. text packed stripped5 167 2 multip. unsigned short6 177 4 multip. unsigned long7 155 4 multip. text8 138 4 multip. unsigned long9 177 4 multip. unsigned long193 1 textFor explanations see below.isamchk -d -v table_nameA little more verbose.ISAM file: company.ISMIsam-version: 2Creation time: 1996-08-28 11:44:22Recover time: 1997-01-12 18:35:29Data records: 1403698 Deleted blocks: 0Datafile: Parts: 1403698 Deleted data: 0Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3Max datafile length: 3791650815 Max keyfile length: 4294967294Recordlength: 226Record format: Fixed lengthrtable description:66Key Start Len Index Type Root Blocksize Rec/key1 2 8 unique double 15845376 1024 12 15 10 multip. text packed stripped 25062400 1024 23 219 8 multip. double 40907776 1024 734 63 10 multip. text packed stripped 48097280 1024 55 167 2 multip. unsigned short 55200768 1024 48406 177 4 multip. unsigned long 65145856 1024 13467 155 4 multip. text 75090944 1024 49958 138 4 multip. unsigned long 85036032 1024 879 177 4 multip. unsigned long 96481280 1024 178193 1 textISAM fileName of isam file.Isam-version

47

Page 48: My sql technical reference manual

Version of isam format. Currently always 2.Creation timeWhen was the data file created.Recover timeWhen was the index/data file last reconstructed.Data recordsHow many records/rows.Deleted blocksHow many deleted blocks still have reserved space. See section How to repair tables. [p 55].Datafile: PartsFor dynamic record format this shows how many data blocks there are. For a optimised tablewithout splits this is the same as Data records.Deleted dataHow many bytes of non reclaimed deleted data.Datafile pointerHow many bytes the datafile pointer has. It is usually 2, 3 or 4 bytes. Most tables managewith 2 bytes but this cannot be controlled from MySQL yet. For fixed tables this is a recordaddress. For dynamic tables this is a byte address.Keyfile pointerHow many bytes has the datafile pointer. It is usually 1, 2 or 3 bytes. Most tables managewith 2 bytes but this is calculated automatically by MySQL. It is always a block address.Max datafile lengthHow long (in bytes) can the table’s data file (.ISD) get.Max keyfile lengthHow long (in bytes) can the table’s key file (.ISM) get.RecordlengthHow much space does each record/row take.Record formatWhich format does each record/row have. This example uses Fixed length.table descriptionA list of all keys in the table. For each key some low level information is presented.KeyThis key’s number.StartWhere in the record/row does this index-part start.67LenHow long is this index-part. For packed numbers this should always be the full lengthof the field. For strings it may be shorter than the full length.

48

Page 49: My sql technical reference manual

Indexunique or multip.. If one value can exist multiple times in this index.TypeWhat data-type does this index part have. This is a C data-type with the options packed,stripped or empty.RootAddress of the root index block.BlocksizeThe size of each index block. This is by default 1024 but may be changed a compiletime.Rec/keyThis is a statistical value used by the optimiser. It tells how many records there are pervalue for this key. A unique key always has a value of 1. This may be updated after atable is loaded (or greatly changed) with isamchk -a. If this is not updated at all, adefault value of 30 is given.The 9th key is a multiple part key with two parts.isamchk -eis table_nameShows only the most important information from a table. Slow since it must read the whole table.Checking ISAM file: company.ISMKey: 1: Keyblocks used: 97% Packed: 0% Max levels: 4Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4Total: Keyblocks used: 98% Packed: 17%Records: 1403698 M.recordlength: 226 Packed: 0%Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00Recordblocks: 1403698 Deleteblocks: 0Recorddata: 317235748 Deleted data: 0Lost space: 0 Linkdata: 0User time 1626.51, System time 232.36Maximum resident set size 0, Integral resident set size 0Non physical pagefaults 0, Physical pagefaults 627, Swaps 0Blocks in 0 out 0, Messages in 0 out 0, Signals 0Voluntary contexts switches 639, Involuntary contexts switches 28966Keyblocks usedHow many percent of the keyblocks are used. Since this table has just been reorganised with

49

Page 50: My sql technical reference manual

isamchk the values are very high (very near theoretical maximum).PackedMySQL tries to pack keys with a common suffix. This can only be used forCHAR/VARCHAR/DECIMAL keys. For long strings like names, this can significantly reducethe space used. In the above example the 4 key is 10 characters long and gets a 60%reduction in space.68Max levelsHow deep is the btree for this key. Large tables with long keys get high values.RecordsHow many rows does the table have.M.recordlengthAverage recordlength. For fixed tables this is the recordlength.PackedMySQL strips spaces from the end of strings. How many percent did we save by doing this.Recordspace usedHow many percent of the datafile is used.Empty spaceHow many percent of the datafile is unused.Blocks/RecordHow many blocks are there per record. This is always 1 for fixed format tables. This valueshould stay as close to 1.0 as possible. If it gets to great you can reorganise the table withisamchk. See section How to repair tables. [p 55] .RecordblocksHow many blocks are used. For fixed format, this is the same as the number of records.DeleteblocksHow many blocks are deleted.RecorddataHow many bytes of actual user data there are in the datafile.Deleted dataHow many bytes of deleted data there are in the datafile.Lost spaceIf a record is updated to a shorter length some space is lost. This is the sum of all suchlosses.LinkdataWhen the dynamic format is used, blocks are linked with pointers (length 4-7 bytes). This isthe sum of all such pointers.isamchk -eiv table_nameSame as above but tells you what it is being done.

50

Page 51: My sql technical reference manual

Checking ISAM file: company.ISMData records: 1403698 Deleted blocks: 0- check file-size- check delete-chainindex 1:index 2:index 3:index 4:index 5:index 6:index 7:index 8:index 9:No recordlinks- check index reference- check data record references index: 1Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4- check data record references index: 2Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4- check data record references index: 3Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4- check data record references index: 469Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3- check data record references index: 5Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3- check data record references index: 6Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3- check data record references index: 7Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3- check data record references index: 8Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3- check data record references index: 9Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4Total: Keyblocks used: 9% Packed: 17%- check records and index references[LOTS OF ROW NUMBERS DELETED]Records: 1403698 M.recordlength: 226 Packed: 0%Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00Recordblocks: 1403698 Deleteblocks: 0Recorddata: 317235748 Deleted data: 0Lost space: 0 Linkdata: 0User time 1639.63, System time 251.61Maximum resident set size 0, Integral resident set size 0Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0Blocks in 4 out 0, Messages in 0 out 0, Signals 0Voluntary contexts switches 10604, Involuntary contexts switches 122798Here is the data file sizes of the table used above.

51

Page 52: My sql technical reference manual

-rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.ISD-rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.ISMThe MySQL compressed read only table generatorpack_isam is an extra that you get when ordering more that 10 licenses or extended support. Sincepack_isam is distributed binary only, pack_isam is only available on some platforms.Of course, all future updates to pack_isam is included in the price. pack_isam may at some timebe included as standard when we get some kind of turnover for MySQL.pack_isam works by compressing each column in the table separately. The information needed todecompress is read into memory when the table is opened. This gives a much better performancewhen accessing individual records as one only has to uncompress exactly one record, not a muchlarger disk block like when using stacker on MSDOS.MySQL uses memory mapping (mmap) on compressed tables and falls back to normal read/write fileusage if mmap did not work.Usually, pack_isam packs the datafile 40-70%.There is currently two limitations with pack_isam:After packing, the table is read only.It can’t pack blobs, yet.70Fixing these limitations is on our TODO but with low priority.pack_isam options:> pack_isam --helppack_isam Ver 5.0 for SOLARIS 2.5 on SPARCstationCopyright (C) 1994-1997 TcX AB & Monty Program KB & Detron HB.This is not free software. You must have a license to use this programThis software comes with ABSOLUTELY NO WARRANTYPack a ISAM-database to take much smaller spaceKeys are not updated, one must run isamchk -rq on datafile afterwardsUsage: pack_isam [OPTIONS]-b, --backup Make a backup of the table as table_name.OLD-f, --force Force packing of table even if it’s gets bigger ortempfile exists.-j, --join=# Join all given tables into table.All tables MUST be identical.-p, --packlength=# Force storage size of recordlength (1,2 or 3)-s, --silent Be more silent.-t, --test Don’t pack table only test packing it-v, --verbose Write info about progress and packing result-w, --wait Wait and retry if table is in use-T, --tmp_dir=# Use temporary directory to store temporary table-#, --debug=... output debug log. Often this is ’d:t:o,filename‘-?, --help display this help and exit

52

Page 53: My sql technical reference manual

-V, --version output version information and exitTypical run:(/my/monty/tmp) ls -l station.*-rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.ISD-rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.ISM-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm(/my/monty/tmp) isamchk -dvv stationISAM file: stationIsam-version: 2Creation time: 1996-03-13 10:08:58Recover time: 1997-02-02 3:06:43Data records: 1192 Deleted blocks: 0Datafile: Parts: 1192 Deleted data: 0Datafilepointer (bytes): 2 Keyfile pointer (bytes): 2Max datafile length: 54657023 Max keyfile length: 33554431Recordlength: 834Record format: Fixed lengthtable description:Key Start Len Index Type Root Blocksize Rec/key1 2 4 unique unsigned long 1024 1024 12 32 30 multip. text 10240 1024 1Field Start Length Type1 1 12 2 43 6 44 10 15 11 206 31 1717 32 308 62 359 97 3510 132 3511 167 412 171 1613 187 3514 222 415 226 1616 242 2017 262 2018 282 2019 302 3020 332 421 336 422 340 123 341 824 349 825 357 8

53

Page 54: My sql technical reference manual

26 365 227 367 228 369 429 373 430 377 131 378 232 380 833 388 434 392 435 396 436 400 437 404 138 405 439 409 440 413 441 417 442 421 443 425 444 429 2045 449 3046 479 147 480 148 481 7949 560 7950 639 7951 718 7952 797 853 805 154 806 155 807 2056 827 457 831 4Compressing station.ISD: (1192 records)- Calculating statisticsnormal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11pre-space: 0 end-space: 12 intervall-fields: 5 zero: 7Original trees: 57 After join: 17- Compressing file87.14%(/my/monty/tmp) ls -l station.*72-rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.ISD-rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.ISM-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm(my/monty/tmp) isamchk -dvv stationISAM file: stationIsam-version: 2Creation time: 1996-03-13 10:08:58

54

Page 55: My sql technical reference manual

Recover time: 1997-04-17 19:04:26Data records: 1192 Deleted blocks: 0Datafile: Parts: 1192 Deleted data: 0Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1Max datafile length: 16777215 Max keyfile length: 131071Recordlength: 834Record format: Compressedtable description:Key Start Len Index Type Root Blocksize Rec/key1 2 4 unique unsigned long 10240 1024 12 32 30 multip. text 54272 1024 1Field Start Length Type Huff tree Bits1 1 1 constant 1 02 2 4 zerofill(1) 2 93 6 4 no zeros, zerofill(1) 2 94 10 1 3 95 11 20 table-lockup 4 06 31 1 3 97 32 30 no endspace, not_always 5 98 62 35 no endspace, not_always, no empty 6 99 97 35 no empty 7 910 132 35 no endspace, not_always, no empty 6 911 167 4 zerofill(1) 2 912 171 16 no endspace, not_always, no empty 5 913 187 35 no endspace, not_always, no empty 6 914 222 4 zerofill(1) 2 915 226 16 no endspace, not_always, no empty 5 916 242 20 no endspace, not_always 8 917 262 20 no endspace, no empty 8 918 282 20 no endspace, no empty 5 919 302 30 no endspace, no empty 6 920 332 4 allways zero 2 921 336 4 allways zero 2 922 340 1 3 923 341 8 table-lockup 9 024 349 8 table-lockup 10 025 357 8 allways zero 2 926 365 2 2 927 367 2 no zeros, zerofill(1) 2 928 369 4 no zeros, zerofill(1) 2 929 373 4 table-lockup 11 030 377 1 3 931 378 2 no zeros, zerofill(1) 2 932 380 8 no zeros 2 933 388 4 allways zero 2 934 392 4 table-lockup 12 035 396 4 no zeros, zerofill(1) 13 936 400 4 no zeros, zerofill(1) 2 9

55

Page 56: My sql technical reference manual

37 404 1 2 938 405 4 no zeros 2 939 409 4 allways zero 2 97340 413 4 no zeros 2 941 417 4 allways zero 2 942 421 4 no zeros 2 943 425 4 allways zero 2 944 429 20 no empty 3 945 449 30 no empty 3 946 479 1 14 447 480 1 14 448 481 79 no endspace, no empty 15 949 560 79 no empty 2 950 639 79 no empty 2 951 718 79 no endspace 16 952 797 8 no empty 2 953 805 1 17 154 806 1 3 955 807 20 no empty 3 956 827 4 no zeros, zerofill(2) 2 957 831 4 no zeros, zerofill(1) 2 9Go to the first [p 5] , previous [p 57] , next [p 75] , last [p 87] section, table of contents [p 1] .74Go to the first [p 5] , previous [p 65] , next [p 76] , last [p 87] section, table of contents [p 1] .Adding functions to MySQLAdding new functions to MySQLIf you need it as sql function (like SOUNDEX()), its real easy:1. Add one line in sql_lex.cc defining the function name in the sql_functions array.2. Add two lines in sql_yacc.y. On defines the preprocessor symbol yacc can define (this should beadded at the beginning of the file). Then define the function parameters and create an ’item’ withthese parameters. Check, for example, all occurrences of SOUNDEX in sql_yacc.y3. In item_func.h declare a class inheriting from Item_num_func or Item_str_func depending onwhether your function returns a number or a string.4. In ‘item_func.cc’ add: double *Item_func_newname::val() If you are defininga number function or String *Item_func_newname::Str(String *str) If you aredefining a string function.5. You should probably also define the following function: voidItem_func_newname::fix_length_and_dec() This should at least calcutate

56

Page 57: My sql technical reference manual

max_length based on the given arguments. max_length is the maximal number of chars thefunction may return. If the function can’t return a NULL, one should set maybe_null = 0.About string functions:1. For string functions the ’String *str’ argument provides a string buffer that may be used to holdthe result.2. A string function should return the string that holds the result.3. All current string functions tries to avoid to alloc any memory unless absolutely necessary!Go to the first [p 5] , previous [p 65] , next [p 76] , last [p 87] section, table of contents [p 1] .75Go to the first [p 5] , previous [p 75] , next [p 78] , last [p 87] section, table of contents [p 1] .ODBCWhich operating systems does MySQL ODBC support?MySQL ODBC is a 32 bit ODBC (2.50) level 0 for Windows95 and NT. We hope somebody will portit to Windows 3.x.How should I report problems with MySQL ODBC?We have only tested ODBC with Admndemo, some C programs, Msquery and Excel.To give some light about any problem we would like to have the log file from the ODBC manager (thelog you get when requesting logs from ODBCADMIN) and a MYODBC log.To get a MYODBC log, please put this MYSQL_DEBUG=d:t:O,filename in yourAUTOEXEC.BAT and restart.The log will be written to file ‘filename’.Programs known to work with MyODBC.Most programs should work with MyODBC, but these we tested ourselves or got a conformation fromsome user that is works:Program CommentAccessWants a primary key and a timestamp in each record to allow updates. Fails ifcomparing with single floats.Excel Works.odbcadmin Test program for ODBC.Delphi One must use DBE 3.2 or newer.C++BuilderTested with BDE 3.0. The only known problem is that when the table schema changes,query fields are not updated. BDE however does not seem to recognise primary keys,only the index PRIMARY, though this has not been a problem.

57

Page 58: My sql technical reference manual

How do I fill in the various fields in the ODBC administratorprogram?There are three possibilities for specifying the server name on windows95:761. Use the IP.2. Add a file lmhosts with the following info: ip hostname For example: 194.216.84.21 my3. Configure the PC to use DNS.Example of how to fill in the ’ODBC setup’.Data Source Name: testDescription: This is my test databaseServer: 194.216.84.21User: montyPassword: myPort:These are default values to be given when prompting for a Driver connect. You don’t have to give’server’, ’user’ or ’password’ in this screen. If port is not given the default port (3333) is used.When connection to a ODBC source you have the option to change the server, user, password andport.Go to the first [p 5] , previous [p 75] , next [p 78] , last [p 87] section, table of contents [p 1] .77Go to the first [p 5] , previous [p 76] , next [p 81] , last [p 87] section, table of contents [p 1] .ProblemsWhy do I get ’Access denied’?Have you installed the MySQL grant tables with the script ’mysql_install_db’? Test by executing’mysql -u root test’. This should not give an error. You can also check if you have a file’user.ISD’ in the mysql database directory (ordinary install_dir/var/mysql/user.ISD).Remember that you have to do ’mysqladmin reload’ each time you change the grant tables.Otherwise the old tables are still used!For testing, you should start the mysqld demon with the --without-grant-tables option.Now you can change the MySQL grant tables and use the script mysqlaccess to check if yourgrants works. mysqladmin reload tells the mysqld demon to start using the new granttables.Even if you have access problems with perl, python, or ODBC, always test your privilegeproblems with mysql -u user database or mysql -uuser -ppassword

58

Page 59: My sql technical reference manual

database.If you get the error ’Access denied’ when trying to connect to the database with mysql -uuser database then you have a problem with the ’user’ table. Check this by doing mysql-u root mysql and select * from user. You should get an entry with ’hostname’ and’user’ matching your computers hostname and your username. If the client and the server isrunning on the same host and you haven’t used the --host option to mysql and you are notusing MIT threads, ’localhost’ is a synonym for your hostname.The ’Access denied’ error message will tell you who you are trying to log in as, from which hostyou are trying to log in from and if you was using a password or not. You should normally haveone entry in the user table that exactly matches your host and user, exactly as given in the errormessage.If mysql -u root test works but mysql -h your_hostname -u root testgives ’Access denied’ then you don’t have the right name for your host in the user table. Forexample if you have an entry with host ’tcx’ in the ’user’ table, but your DNS tells MySQL thatyour hostname is ’tcx.subnet.se’ then the entry will not work. Test by adding a record with the IPof your host in the ’user’ table. You can, natuarally, also add a host with a wildcard (for example’tcx%’) in the ’user table’ (but using hostnames ending with % is pretty insecure).When using MIT threads, localhost is never used. All connections to the mysqld demon is doneby TCP IP and you must have your real hostname in ’user’ even if you are running the client onthe same host as the server.If you get the error ’Access to database denied’ then you have a problem with the db table. If theused entry in the db table has an empty hostname, check also the corresponding entry in the’host’ table.If mysql -u user database works on the server machine, but mysql -u host -uuser database doesn’t work on another client machine, then you don’t have the clientmachine in the ’user’ or the ’db’ table.If you can’t get password to work, remember that passwords must be inserted with thePASSWORD function. See section A example of permission setup. [p 29]If mysql -u user test works but mysql -u user other_database doesn’t work,

59

Page 60: My sql technical reference manual

you don’t have the other_database in the ’db’ table.78If you get ’Access to database denied’ when using the SELECT ... INTO OUTFILE orLOAD DATA SQL commands then you probably don’t have the file_priv privilege set for you inthe user table.If everything else fails, start the mysqld demon with: --debug=d,general,query. Thiswill print info about the host and user that tries to connect and also information about eachcommand issued. See section How to debug MySQL [p 25] .If you have any other problems with the MySQL grant tables and feel you must post the problemto the list, always add a dump of the MySQL grant tables. You can dump the tables with the’mysqldump mysql’ command. Post your problem with the mysqlbug script.See section How does the privilege system work? [p 26]How to run MySQL as a normal user.mysqld (the MySQL server) can run as any user. In order to change mysqld to run as user USER,you’d have to the following:Stop the server if its runningChange the database directories so that USER has read and write privliges priviliges to them:shell> chown -R USER /your/path/to/mysql/varstart the server as user USERIf you are using mysql.server to start mysqld when the system is rebooted, you should changemysql.server to call ’su’ to user USER.You don’t have to do anything to safe_mysqld to run as not root.At this point, your mysqld process would be running fine and dandy as user ’USER’. One thing hasn’tchanged though - the access permissions. By default (right after running the permissions table installscript), only user ’root’ has access permission to the database. Unless you have changed that, it’s stilltrue. This shouldn’t stop you from accessing MySQL when you’re logged in under a user other thanroot, just specify -u root to the client program. Note that accessing MySQL as root, by supplying -uroot in the command line, doesn’t have ANYTHING to do with MySQL running as root, as a user oras anyone else. The access permissions and userbase of MySQL are completely separate from theUNIX users. The only connection to the UNIX users us if you don’t use the -u option to clients. In this

60

Page 61: My sql technical reference manual

case the client will try to login into MySQL with your UNIX login name. If your UNIX box itselfisn’t secured, you should probably at least put a password on the root users in the MySQL accesstables, since any johndoe user can run ’mysql -u root dbname’ and do whatever he likes.Problems with file permissionsIf you have problems with file permissions, for example when creating a table mysql gives: "ERROR:Can’t find file: ’path/with/filename.frm’ (Errcode: 13)", then you might have the wrong value forenvironment variable UMASK. Default umask is 0664. Fix:UMASK=432export UMASK./bin/safe_mysqld79Problems using DATE fields.The format of DATE is ’YYYY-MM-DD’. Actually nothing else is allowed (ANSI SQL). One shoulduse this format to update or in the WHERE clause, ie select * from table_1 where idate >=’1997-05-05’;As a convenience, MySQL automatically converts the date to a number if used in a number context. Itis also smart enough to allow a ’relaxed’ string form when updating and in a WHERE with a compareto a TIMSTAMP, DATE or a DATETIME field.This means that the following works:insert into table_1 (idate) values (19970505) ;insert into table_1 (idate) values (’19970505’) ;insert into table_1 (idate) values (’1997-05-05’);insert into table_1 (idate) values (’1997.05.05’);insert into table_1 (idate) values (’1997 05 05’);select idate from table_1 where idate >= ’1997-05-05’;select idate from table_1 where idate >= 19970505;select mod(idate,100)1 from table_1 where idate >= 19970505;select idate from table_1 where idate >= ’19970505’;The following will not work:select idate from table_1 where strcmp(idate,’19970505’)=0;Because ’19970505’ is compared as a string to ’1997-05-05’.Go to the first [p 5] , previous [p 76] , next [p 81] , last [p 87] section, table of contents [p 1] .80Go to the first [p 5] , previous [p 78] , next [p 87] , last [p 87] section, table of contents [p 1] .MySQL client tools and API’sMySQL C API

61

Page 62: My sql technical reference manual

The C API is distributed with MySQL. It is included in the libmysqlclinet library.It allows Cprograms to access a database.int mysql_affected_rows(MYSQL *mysql)Retrieves the number of affected rows bythe last UPDATE, DELETE or INSERT.void mysql_close(MYSQL *mysql) Closes a server connection.MYSQL *mysql_connect(MYSQL *mysql, const char*host, const char *user, const char *passwd)Establish a connection to a MySQLserver.int mysql_create_db(MYSQL *mysql, const char *db) Create a database.void mysql_data_seek(MYSQL_RES *res, uint offset)Seeks to an arbitrary row in a queryresult set.int mysql_drop_db(MYSQL *mysql, const char *db) Drop a database.int mysql_eof(MYSQL_RES *) Determine if last row has been read.char *mysql_error(MYSQL *mysql)The error message from last MySQLfunction.MYSQL_FIELD *mysql_fetch_field(MYSQL_RES*handle)Find out what type a table field is.unsigned int *mysql_fetch_lengths(MYSQL_RES*mysql)Returns the length of all columns in aquery result set.MYSQL_ROW mysql_fetch_row(MYSQL_RES*mysql)Fetch the ’next’ row in the query result.void mysql_field_seek(MYSQL_RES *result, int field)Put the column cursor on column numberfield.void mysql_free_result(MYSQL_RES *result) Free memory used to store a query result.char *mysql_get_client_info(void)Return version information for thecurrent client library.char *mysql_get_host_info(MYSQL *mysql) Returns name of server host.int mysql_get_proto_info(MYSQL *mysql) Get protocol version used by connection.char *mysql_get_server_info(MYSQL *mysql) Returns the version number of the server.81int mysql_insert_id(MYSQL *mysql)Returns ID generated forAUTO_INCREMENT field.MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const

62

Page 63: My sql technical reference manual

char *wild)Return maching database names.MYSQL_RES *mysql_list_fields(MYSQL *mysql,const char *table, const char *wild)Return maching field names.MYSQL_RES *mysql_list_processes(MYSQL *mysql) Get a list of the current server threads.MYSQL_RES *mysql_list_tables(MYSQL *mysql,const char *wild)Return maching table names.int mysql_num_fields(MYSQL_RES *result)Return the number of columns in a resultset.int mysql_num_rows(MYSQL_RES *result) Returns the number of rows in result set.int mysql_query(MYSQL *mysql, const char *query) Executes a SQL query.int mysql_real_query(MYSQL *mysql, const char*query, uint length)Executes a SQL query with lengthinformation.int mysql_reload(MYSQL *mysql)Reload the user permissions table in theserver.int mysql_select_db(MYSQL *mysql, const char *db) Connect to a database.int mysql_shutdown(MYSQL *mysql) Shut down the database server.char *mysql_stat(MYSQL *mysql) Return server status in a string.MYSQL_RES *mysql_store_result(MYSQL *mysql) Reads a result set to the client.MYSQL_RES *mysql_use_result(MYSQL *mysql) Initiate a dynamic result set for each row.Why is it that after mysql_query() returns success,mysql_store_result() sometimes returns NULL?It means one of the following:1. Malloc failure.2. The data couldn’t be read (Error on connection).3. The statement was a statement which never returns data (INSERT or UPDATE or DELETE).You can always check if the statement should have given a result by checking thatmysql_num_columns(MYSQL *) isn’t 0. If this is 0 the last query was a statement that does notreturn values INSERT, DELETE....You have got an error if mysql_error(MYSQL *) isn’t empty!82What results can I get from a query?mysql_affected_rows(MYSQL *) returns the number of affected rows in the last query when

63

Page 64: My sql technical reference manual

doing an INSERT, UPDATE or DELETE. Except, if DELETE is used without a where clause then thetable is truncated which is much faster!. In this case it returns records affected as zero.mysql_insert_id(MYSQL *) returns the given ID of the last query when inserting a row into atable with a AUTO_INCREMENT key. See section How can I get the unique ID for the last row? [p 83]Some queries, LOAD DATA INFILE... and INSERT INTO ... SELECT ..., returnadditional info. The result is returned in mysql_info(MYSQL *). mysql_info() returns a nullpointer if there is no additional information.How can I get the unique ID for the last row?If you insert a record that has a AUTO_INCREMENT key then you can get the given id withmysql_insert_id(MYSQL *).The last value is also stored in the server and can be retrieved with the LAST_INSERT_ID()function.You can check if an auto_increment key is used by the following code. This also checks if the querywas a insert with a auto_increment key.if (mysql_error(MYSQL)[0] == 0 &&mysql_num_fields(MYSQL_RESULT) == 0 &&mysql_insert_id(MYSQL) != 0)used_id = mysql_insert_id(MYSQL);When using mysql_perl you can do something like:$std=$dbh->query("insert into foo (auto,text) values(NULL,’text’)");print $std->insert_id;With DBD-mysql you can do something like:$dbh->do("INSERT INTO foo (auto,text) VALUES(NULL,’text’)");print $dbh->func("_InsertID");With ODBC you can do something like this:INSERT INTO foo (auto,text) VALUES(NULL,’text’)select LAST_INSERT_ID()or evenINSERT INTO foo (auto,text) VALUES(NULL,’text’)INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),’text’)What is the difference between mysql_use_result() andmysql_store_result() modes?83mysql_use_results reads the result directly from the server without storing it in a local differ.This is somewhat faster and uses much less memory. One shouldn’t use mysql_use_results ifthere is a lot of processing being done for each row at the client side, or if the output is sent to a screen

64

Page 65: My sql technical reference manual

on which the user may do a ^S (stop scroll). Doing this would tie up the server and then other threadscan’t update the used tables. One can’t use mysql_data_seek when usingmysql_use_result.Problems linking with C API.When linking with the C API you can get the following errors on some systems:gcc -g -o client test.o -L/usr/local/lib/mysql -lmysqlclient -lsocket -lnslUndefined first referencedsymbol in filefloor /usr/local/lib/mysql/libmysqlclient.a(password.o)ld: fatal: Symbol referencing errors. No output written to clientThis means that on your system you have to include the math library (-lm) last in the compile/linkline.How to make a threadsafe clientThe client is ’almost’ thread-safe. The biggest problem is that net.c (the subroutines that read fromsockets) are not interrupt safe. This was done with the thought that one may want to have one’s ownalarm that can break a long read to a server.The standard client libraries are not compiled with the thread options.To get a thread safe client use the -lmysys, -lstring and -ldbug libraries and net_serv.o that the serveruses.When using a threaded client I think one can have great use of the thr_alarm.c routine. If you are usingthe mysys routines, the only thing one has to remember is to call my_init() first!Making a threadsafe clientAll functions except mysql_connect() are currently thread safe.To get connect thread_safe you have to do the following:Recompile the client with:CPPFLAGS=-DTHREAD_SAFE_CLIENT ./configure ....You may get some errors because of undefined symbols when linking the standard client as thepthread libraries are not included by default.The resulting libmysqld.a library is now thread safe.Two treads can’t use the same handle (returned by mysql_connect()) at the same time, even if twothreads can use different MYSQL_RES handles that was created with mysql_store_result().84When using a threaded client one can have great use of the thr_alarm.c routine. If you are using themysys routines, the only thing one has to remember is to call my_init() first!What is the difference between different thread packages?There are at least three types of thread packages.

65

Page 66: My sql technical reference manual

User threads in a single process; Thread switching is managed with alarms and the threads librarymanages all not thread- safe functions with locks. Read, write and select are usually managedwith a thread-specific select that switches to another thread if the running threads have to wait fordata. If the user thread packages are integrated in the standard libs (FreeBSD and BSDI threads)the thread package requires less overhead than thread packages that have to map all unsafe calls(MIT-threads, FSU-threads and RTS threads). In some environments (for example SCO), allsystem calls are thread- safe so the mapping can be done very easily (FSU-threads on SCO).Downside: All mapped calls take a little time and it’s quite tricky to be able to handle allsituations. There are usually also some system calls that are not handled by the thread package(like MIT-threads and sockets). Thread scheduling isn’t always optimal.User threads in separate processes; Thread switching is done by the kernel and all data is sharedbetween threads. The thread package manages the standard thread calls to allow sharing databetween threads. Linuxthreads is using this method. Downside: Lots of processes. Threadcreating is slow. If one thread dies the rest are usually left hanging and one has to kill them allbefore restarting. Thread switching is somewhat expensive.Kernel threads; Thread switching is handled by the thread library or the kernel and is very fast.Everything is done in one process but ’ps’ may on some systems show the different threads. Ifone thread aborts the whole process aborts. Most system calls are threadsafe and should requirevery little overhead. Solaris, HPUX, AIX and OSF1 has kernel threads.In some systems kernel threads are managed by integrating user level threads in the system libraries.In such cases, the thread switching can only be done by the thread library and the kernel isn’t really’thread aware’.MySQL Perl API’smysqlperlDBD::mysqlMySQL JAVA connectivity (JDBC)MySQL C++ API’sMySQL TCL API’s85MySQL Python API’s

66

Page 67: My sql technical reference manual

MySQL Python API’sGo to the first [p 5] , previous [p 78] , next [p 87] , last [p 87] section, table of contents [p 1] .86Go to the first [p 5] , previous [p 81] , next, last section, table of contents [p 1] .How does MySQL compare with other databasesHow does MySQL compare with mSQLThis section has been written by the MySQL developers so it should be read with that in mind. Butthere are NO factual error that we know of.Performance.For a true comparison of speed so the growing MySQL benchmarks suite. It is meant to be abenchmark that will tell any user which SQL is good at what. Because of no thread creationoverhead, small parser, few features and simple security mSQL should be quicker at:Test that do a lot of connect/disconnect with a very simple query.Inserts into very simple tables with few fields and keys.CREATE TABLE and DROP TABLE.SELECT one something that isn’t a key. (A table scan is very easy)As these operations are so simple, it is hard to be better at them when you have a higher startoverhead. After the connection is established MySQL should perform much better. MySQL onthe other hand is much faster than mSQL and most other SQL implementions on the following:Retrieving large results (MySQL has a better, faster and safer protocol)Tables with variable length strings since MySQL has more efficent handling and can havekeys on varchars.Handling tables with many fields (columns).Handling tables with large record lengths.SELECT with many expressions.SELECT on large tables.Handle many connections at the same time. MySQL handles with multiple threads. mSQLwill take care of one connection at a time. This problem only exists on MySQL if you makelong update statements (like updating the whole table) and even in those cases other threadscan continue to work with other tables.Joins (I have seen speed differences of 50 times on this one).ORDER BY and GROUP BY.DISTINCT.Using TEXT or BLOB columns.Disk space efficiency

67

Page 68: My sql technical reference manual

That is, how small can you make your tables. MySQL has very precise types so that use cancreate tables that take very little space. An example of a useful MySQL datatype is themediumint that is 3 bytes long. If you have 10.000.0000 records even saving one byte per recordis very important. Since mSQL2 only has 4 types (char,text,int,real) it is hard to get small tables.StabilityThis is harder to judge objectively. For MySQL stability see See section How stable is MySQL?[p 52] . We have no experience with mSQL stability so we can not say anything about that.PriceAnother important issue is of course the license. MySQL has a more flexible license than mSQLand is also cheaper than mSQL. Remember to at least consider paying for a license or emailsupport for whatever product you choose to use. If you sell a product with MySQL you are of87course required to get a license for this.Perl interfacesMySQL has basically the same interfaces to perl as mSQL with some added features.JDBC (Java)MySQL has a java interface by GWE technologies that has been improved by Xiaokun KelvinZHU. We know that mSQL has one but we have too little experience with it to compare.Rate of developmentMySQL has a very small team of developers, but we are quite use to coding C and C++ veryrapidly. Since threads, functions, group by and so on are still not implemented in mSQL, it has alot of catching up to do. To get some perspective on this you can view the mSQL HISTORY filefor the last year and compare it with MySQL NEWS file. It should be pretty obvious which onehas developed most rapidly.Utility programsBoth mSQL and MySQL has a lot of interesting third party tools. Since it is very easy to portupwars (mSQL -> MySQL) MySQL has almost all interesting mSQL applications. MySQLcomes with a simple msql2mysql program that fixes the different spelling of the most used

68

Page 69: My sql technical reference manual

functions. A conversion of a client program from mSQL to mySQL usually takes a couple ofminutes.How about mSQL tools like msql-tcl, msqljava?According to our experience it would just take a few hours to convert a tool using the mSQL C API tothe MySQL C API.The procedure:1. Run the shell script msql2mysql on the source. This needs the binary program replace, which isdistributed with MySQL.2. Compile3. Fix all compiler errors:Differences between the MySQL and mSQL C API’s.MySQL uses MySQL as a connection type (mSQL uses an int).MySQL connect takes a pointer to a MYSQL structure as a parameter. It is easy to define oneglobally or use malloc to get one.mysql_connect takes 2 extra parameters. You may set these to NULL,NULL for default use (userand password).mysql_error takes the MYSQL structure as a parameter. Just add the parameter to your oldmsql_error code if you are porting old code.Some incompatibilities exist as a result of MySQL supporting multiple connections to the serverfrom the same process.MySQL returns a error number and a text for all errors. mSQL only returns a text errorHow different from mSQL are the MySQL client/servercommunications protocols?88There are enough differences that it is impossible (at least not easy) to support both.The greatest differences between MySQL and mSQL are:A message buffer may contain many result rows.The message buffers are dynamically enlarged if the question or the result is bigger than thecurrent buffer up to a configurable server and client limit.All packages are numbered to catch out dupplicated or missing packets.All columns are sent in ASCII, the length of columns and rows are sent in packed binary coding(1,2 or 3 bytes).MySQL can read in the result unbuffered (without having to store the full set in the client).If a single write/read takes more than 30 seconds then the server closes the connection.

69

Page 70: My sql technical reference manual

If nothing has happened on a connection for 8 hours the server closes the connection.We don’t think it makes sense to give a full specification of the connection protocol as we have plansto optimize this in the near future.What are the differences in the SQL syntax between MySQL& mSQL 2.0?CREATE TABLEMySQLHas the following column option types: See section CREATE TABLE syntax. [p 36]UNSIGNED for integer columns.ZEROFILL for integer columns.AUTO_INCREMENT for integer columns. See section How can I get the unique IDfor the last row? [p 83]DEFAULT values for all columns.MySQL also have many more types than ANSI SQL.mSQLTo create indexes.MySQLAll indexes have to be given to CREATE TABLE. Indexes can not be removed withoutrecreating the table. See section ALTER TABLE syntax [p 37] .mSQLIndexes must be created by a separate CREATE INDEX clause. Indexes may be removedwith DROP INDEX.To get a unique identifier in a table at insert.MySQLUse autoincrement as a column type specifier. See section How can I get the unique IDfor the last row? [p 83]mSQLCreate a SEQUENCE on a table and use the __seq function to get a unique index.Group functions (functions that can be used in a SQL group by clause).MySQLcount(), avg(), min(), max(), sum() and std(). min() and max() may takestring arguments. count(*) is optimised to return very quickly if this is the only thing inthe query:89SELECT COUNT(*) FROM table_namemSQLDoes not support GROUP BY yet.How do I search independent of character case?MySQL

70

Page 71: My sql technical reference manual

LIKE is always case independent. If possible MySQL uses indexes if the like argumentdoesn’t start with a wild-card.mSQLUse CLIKE.How do I search with regular expressions?MySQLUse REGEXP or RLIKE. The syntax should be basically POSIX.mSQLUse RLIKE.What are the differences in the WHERE statement?MySQLMySQL does everything according to mathematical priorities (AND is evaluated beforeOR). To get mSQL behaviour in MySQL, use brackets: select * from tablewhere a=1 and b=2 or a=3 and b=4 -> select * from table where(a=1 and (b=2 or (a=3 and (b=4)))).mSQLEvaluates everything from left to right. That means that some logical calculation with morethat 3 arguments can not be expressed.Qualifying column namesMySQLIf a column name is unique you do not have to use the full qualifier.mSQLWhen using more than one table in a select you must use full table qualifiers.AliasingMySQLHas table and column aliasing.mSQLHas table aliasing.Insert/update with calculations.MySQLFull calculation support. In a insert you may use values of preceding columns.mSQLOnly insert update with constants.Which formulas may be used in the select statementMySQLToo many to print here. See section SELECT syntax [p 39] .mSQLNo functions are supported yet.SQL HAVING clause.MySQLSupported, but can only use calculation on the selected columns. To select on a calculatedvalue one must use a column alias. Ex: SELECT COUNT(*) AS id_count,id FROM

71

Page 72: My sql technical reference manual

groups GROUP BY id HAVING id_count > 10.90mSQLNot supported.Access ControlMySQLHas tables to store grant options per user, host and db. See section How does the privilegesystem work? [p 26]mSQLHas a file ‘mSQL.acl’ where you can grant read/write privileges for users.ThreadsMySQLIs multi-threaded. Each connection has it is own thread, which means that none of them hasto wait for the other (unless a data-modifying query is executed).mSQLAll other connections have to wait until the first, doesn’t matter whether the query is long orshort, is executed and finished. After that the next connection can be served, while the otherswait again, etc.SpeedMySQL is significantly quicker on complex selects than mSQL.Problems with AND and OR priorityRemember that AND has higher priority in boolean algebra than OR. It is like 1+2*3 is = 1+ (2*3) = 7.Always when you are in doubt:1. Remove all distinct keywords to make the query easier to debug.2. Write all fields from all tables to really see what you are doing.This will make it easier to see what goes wrong. Distinct may also be a lot slower than a normal select.Go to the first [p 5] , previous [p 81] , next, last section, table of contents [p 1] .91

72


Recommended