manual.txt
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1762k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. Any index that doesn't span all `AND' levels in the `WHERE' clause is
  2. not used to optimize the query. In other words:  To be able to use an
  3. index, a prefix of the index must be used in every `AND' group.
  4. The following `WHERE' clauses use indexes:
  5.      ... WHERE index_part1=1 AND index_part2=2 AND other_column=3
  6.      ... WHERE index=1 OR A=10 AND index=2      /* index = 1 OR index = 2 */
  7.      ... WHERE index_part1='hello' AND index_part_3=5
  8.                /* optimized like "index_part1='hello'" */
  9.      ... WHERE index1=1 and index2=2 or index1=3 and index3=3;
  10.                /* Can use index on index1 but not on index2 or index 3 */
  11. These `WHERE' clauses do *NOT* use indexes:
  12.      ... WHERE index_part2=1 AND index_part3=2  /* index_part_1 is not used */
  13.      ... WHERE index=1 OR A=10                  /* Index is not used in both AND parts */
  14.      ... WHERE index_part1=1 OR index_part2=10  /* No index spans all rows */
  15. Note that in some cases *MySQL* will not use an index, even if one
  16. would be available.  Some of the cases where this happens are:
  17.    * If the use of the index would require *MySQL* to access more than
  18.      30 % of the rows in the table.  (In this case a table scan is
  19.      probably much faster, as this will require us to do much fewer
  20.      seeks).  Note that if such a query uses `LIMIT' to only retrieve
  21.      part of the rows, *MySQL* will use an index anyway, as it can much
  22.      more quickly find the few rows to return in the result.
  23. Speed of Queries that Access or Update Data
  24. ===========================================
  25. First, one thing that affects all queries: The more complex permission
  26. system setup you have, the more overhead you get.
  27. If you do not have any `GRANT' statements done, *MySQL* will optimize
  28. the permission checking somewhat. So if you have a very high volume it
  29. may be worth the time to avoid grants. Otherwise more permission check
  30. results in a larger overhead.
  31. If your problem is with some explicit *MySQL* function, you can always
  32. time this in the *MySQL* client:
  33.      mysql> select benchmark(1000000,1+1);
  34.      +------------------------+
  35.      | benchmark(1000000,1+1) |
  36.      +------------------------+
  37.      |                      0 |
  38.      +------------------------+
  39.      1 row in set (0.32 sec)
  40. The above shows that *MySQL* can execute 1,000,000 `+' expressions in
  41. 0.32 seconds on a `PentiumII 400MHz'.
  42. All *MySQL* functions should be very optimized, but there may be some
  43. exceptions, and the `benchmark(loop_count,expression)' is a great tool
  44. to find out if this is a problem with your query.
  45. Estimating Query Performance
  46. ----------------------------
  47. In most cases you can estimate the performance by counting disk seeks.
  48. For small tables, you can usually find the row in 1 disk seek (as the
  49. index is probably cached).  For bigger tables, you can estimate that
  50. (using B++ tree indexes) you will need: `log(row_count) /
  51. log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) +
  52. 1' seeks to find a row.
  53. In *MySQL* an index block is usually 1024 bytes and the data pointer is
  54. usually 4 bytes. A 500,000 row table with an index length of 3 (medium
  55. integer) gives you: `log(500,000)/log(1024/3*2/(3+4)) + 1' = 4 seeks.
  56. As the above index would require about 500,000 * 7 * 3/2 = 5.2M,
  57. (assuming that the index buffers are filled to 2/3, which is typical)
  58. you will probably have much of the index in memory and you will probably
  59. only need 1-2 calls to read data from the OS to find the row.
  60. For writes, however, you will need 4 seek requests (as above) to find
  61. where to place the new index and normally 2 seeks to update the index
  62. and write the row.
  63. Note that the above doesn't mean that your application will slowly
  64. degenerate by N log N!  As long as everything is cached by the OS or SQL
  65. server things will only go marginally slower while the table gets
  66. bigger. After the data gets too big to be cached, things will start to
  67. go much slower until your applications is only bound by disk-seeks
  68. (which increase by N log N). To avoid this, increase the index cache as
  69. the data grows. *Note Server parameters::.
  70. Speed of `SELECT' Queries
  71. -------------------------
  72. In general, when you want to make a slow `SELECT ... WHERE' faster, the
  73. first thing to check is whether or not you can add an index. *Note
  74. *MySQL* indexes: MySQL indexes. All references between different tables
  75. should usually be done with indexes. You can use the `EXPLAIN' command
  76. to determine which indexes are used for a `SELECT'.  *Note `EXPLAIN':
  77. EXPLAIN.
  78. Some general tips:
  79.    * To help *MySQL* optimize queries better, run `myisamchk --analyze'
  80.      on a table after it has been loaded with relevant data. This
  81.      updates a value for each index part that indicates the average
  82.      number of rows that have the same value.  (For unique indexes,
  83.      this is always 1, of course.).  *MySQL* will use this to decide
  84.      which index to choose when you connect two tables with 'a
  85.      non-constant expression'.  You can check the result from the
  86.      `analyze' run by doing `SHOW INDEX FROM table_name' and examining
  87.      the `Cardinality' column.
  88.    * To sort an index and data according to an index, use `myisamchk
  89.      --sort-index --sort-records=1' (if you want to sort on index 1).
  90.      If you have a unique index from which you want to read all records
  91.      in order according to that index, this is a good way to make that
  92.      faster.  Note, however, that this sorting isn't written optimally
  93.      and will take a long time for a large table!
  94. How MySQL Optimizes `WHERE' Clauses
  95. -----------------------------------
  96. The `WHERE' optimizations are put in the `SELECT' part here because
  97. they are mostly used with `SELECT', but the same optimizations apply for
  98. `WHERE' in `DELETE' and `UPDATE' statements.
  99. Also note that this section is incomplete. *MySQL* does many
  100. optimizations, and we have not had time to document them all.
  101. Some of the optimizations performed by *MySQL* are listed below:
  102.    * Removal of unnecessary parentheses:
  103.              ((a AND b) AND c OR (((a AND b) AND (c AND d))))
  104.           -> (a AND b AND c) OR (a AND b AND c AND d)
  105.    * Constant folding:
  106.              (a<b AND b=c) AND a=5
  107.           -> b>5 AND b=c AND a=5
  108.    * Constant condition removal (needed because of constant folding):
  109.              (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
  110.           -> B=5 OR B=6
  111.    * Constant expressions used by indexes are evaluated only once.
  112.    * `COUNT(*)' on a single table without a `WHERE' is retrieved
  113.      directly from the table information.  This is also done for any
  114.      `NOT NULL' expression when used with only one table.
  115.    * Early detection of invalid constant expressions. *MySQL* quickly
  116.      detects that some `SELECT' statements are impossible and returns
  117.      no rows.
  118.    * `HAVING' is merged with `WHERE' if you don't use `GROUP BY' or
  119.      group functions (`COUNT()', `MIN()'...).
  120.    * For each sub-join, a simpler `WHERE' is constructed to get a fast
  121.      `WHERE' evaluation for each sub-join and also to skip records as
  122.      soon as possible.
  123.    * All constant tables are read first, before any other tables in the
  124.      query.  A constant table is:
  125.         - An empty table or a table with 1 row.
  126.         - A table that is used with a `WHERE' clause on a `UNIQUE'
  127.           index, or a `PRIMARY KEY', where all index parts are used
  128.           with constant expressions and the index parts are defined as
  129.           `NOT NULL'.
  130.      All the following tables are used as constant tables:
  131.           mysql> SELECT * FROM t WHERE primary_key=1;
  132.           mysql> SELECT * FROM t1,t2
  133.                      WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
  134.    * The best join combination to join the tables is found by trying all
  135.      possibilities. If all columns in `ORDER BY' and in `GROUP BY' come
  136.      from the same table, then this table is preferred first when
  137.      joining.
  138.    * If there is an `ORDER BY' clause and a different `GROUP BY'
  139.      clause, or if the `ORDER BY' or `GROUP BY' contains columns from
  140.      tables other than the first table in the join queue, a temporary
  141.      table is created.
  142.    * If you use `SQL_SMALL_RESULT', *MySQL* will use an in-memory
  143.      temporary table.
  144.    * Each table index is queried, and the best index that spans fewer
  145.      than 30% of the rows is used. If no such index can be found, a
  146.      quick table scan is used.
  147.    * In some cases, *MySQL* can read rows from the index without even
  148.      consulting the data file.  If all columns used from the index are
  149.      numeric, then only the index tree is used to resolve the query.
  150.    * Before each record is output, those that do not match the `HAVING'
  151.      clause are skipped.
  152. Some examples of queries that are very fast:
  153.      mysql> SELECT COUNT(*) FROM tbl_name;
  154.      mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
  155.      mysql> SELECT MAX(key_part2) FROM tbl_name
  156.                 WHERE key_part_1=constant;
  157.      mysql> SELECT ... FROM tbl_name
  158.                 ORDER BY key_part1,key_part2,... LIMIT 10;
  159.      mysql> SELECT ... FROM tbl_name
  160.                 ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;
  161. The following queries are resolved using only the index tree (assuming
  162. the indexed columns are numeric):
  163.      mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
  164.      mysql> SELECT COUNT(*) FROM tbl_name
  165.                 WHERE key_part1=val1 AND key_part2=val2;
  166.      mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;
  167. The following queries use indexing to retrieve the rows in sorted order
  168. without a separate sorting pass:
  169.      mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,...
  170.      mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,...
  171. How MySQL Optimizes `DISTINCT'
  172. ------------------------------
  173. `DISTINCT' is converted to a `GROUP BY' on all columns, `DISTINCT'
  174. combined with `ORDER BY' will in many cases also need a temporary table.
  175. When combining `LIMIT #' with `DISTINCT', *MySQL* will stop as soon as
  176. it finds `#' unique rows.
  177. If you don't use columns from all used tables, *MySQL* will stop the
  178. scanning of the not used tables as soon as it has found the first match.
  179.      SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
  180. In the case, assuming t1 is used before t2 (check with `EXPLAIN'), then
  181. *MySQL* will stop reading from t2 (for that particular row in t1) when
  182. the first row in t2 is found.
  183. How MySQL Optimizes `LEFT JOIN' and `RIGHT JOIN'
  184. ------------------------------------------------
  185. `A LEFT JOIN B' in *MySQL* is implemented as follows:
  186.    * The table `B' is set to be dependent on table `A' and all tables
  187.      that `A' is dependent on.
  188.    * The table `A' is set to be dependent on all tables (except `B')
  189.      that are used in the `LEFT JOIN' condition.
  190.    * All `LEFT JOIN' conditions are moved to the `WHERE' clause.
  191.    * All standard join optimizations are done, with the exception that
  192.      a table is always read after all tables it is dependent on.  If
  193.      there is a circular dependence then *MySQL* will issue an error.
  194.    * All standard `WHERE' optimizations are done.
  195.    * If there is a row in `A' that matches the `WHERE' clause, but there
  196.      wasn't any row in `B' that matched the `LEFT JOIN' condition, then
  197.      an extra `B' row is generated with all columns set to `NULL'.
  198.    * If you use `LEFT JOIN' to find rows that don't exist in some table
  199.      and you have the following test: `column_name IS NULL' in the
  200.      `WHERE' part, where column_name is a column that is declared as
  201.      `NOT NULL', then *MySQL* will stop searching after more rows (for
  202.      a particular key combination) after it has found one row that
  203.      matches the `LEFT JOIN' condition.
  204. `RIGHT JOIN' is implemented analogously as `LEFT JOIN'.
  205. The table read order forced by `LEFT JOIN' and `STRAIGHT JOIN' will
  206. help the join optimizer (which calculates in which order tables should
  207. be joined) to do its work much more quickly, as there are fewer table
  208. permutations to check.
  209. Note that the above means that if you do a query of type:
  210.      SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
  211. *MySQL* will do a full scan on `b' as the `LEFT JOIN' will force it to
  212. be read before `d'.
  213. The fix in this case is to change the query to:
  214.      SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
  215. How MySQL Optimizes `LIMIT'
  216. ---------------------------
  217. In some cases *MySQL* will handle the query differently when you are
  218. using `LIMIT #' and not using `HAVING':
  219.    * If you are selecting only a few rows with `LIMIT', *MySQL* will
  220.      use indexes in some cases when it normally would prefer to do a
  221.      full table scan.
  222.    * If you use `LIMIT #' with `ORDER BY', *MySQL* will end the sorting
  223.      as soon as it has found the first `#' lines instead of sorting the
  224.      whole table.
  225.    * When combining `LIMIT #' with `DISTINCT', *MySQL* will stop as
  226.      soon as it finds `#' unique rows.
  227.    * In some cases a `GROUP BY' can be resolved by reading the key in
  228.      order (or do a sort on the key) and then calculate summaries until
  229.      the key value changes.  In this case `LIMIT #' will not calculate
  230.      any unnecessary `GROUP BY''s.
  231.    * As soon as *MySQL* has sent the first `#' rows to the client, it
  232.      will abort the query.
  233.    * `LIMIT 0' will always quickly return an empty set.  This is useful
  234.      to check the query and to get the column types of the result
  235.      columns.
  236.    * The size of temporary tables uses the `LIMIT #' to calculate how
  237.      much space is needed to resolve the query.
  238. Speed of `INSERT' Queries
  239. -------------------------
  240. The time to insert a record consists approximately of:
  241.    * Connect:                 (3)
  242.    * Sending query to server: (2)
  243.    * Parsing query:           (2)
  244.    * Inserting record:        (1 x size of record)
  245.    * Inserting indexes:       (1 x number of indexes)
  246.    * Close:                   (1)
  247. where the numbers are somewhat proportional to the overall time. This
  248. does not take into consideration the initial overhead to open tables
  249. (which is done once for each concurrently running query).
  250. The size of the table slows down the insertion of indexes by N log N
  251. (B-trees).
  252. Some ways to speed up inserts:
  253.    * If you are inserting many rows from the same client at the same
  254.      time, use multiple value lists `INSERT' statements. This is much
  255.      faster (many times in some cases) than using separate `INSERT'
  256.      statements.
  257.    * If you are inserting a lot of rows from different clients, you can
  258.      get higher speed by using the `INSERT DELAYED' statement. *Note
  259.      `INSERT': INSERT.
  260.    * Note that with `MyISAM' you can insert rows at the same time
  261.      `SELECT's are running if there are no deleted rows in the tables.
  262.    * When loading a table from a text file, use `LOAD DATA INFILE'. This
  263.      is usually 20 times faster than using a lot of `INSERT' statements.
  264.      *Note `LOAD DATA': LOAD DATA.
  265.    * It is possible with some extra work to make `LOAD DATA INFILE' run
  266.      even faster when the table has many indexes. Use the following
  267.      procedure:
  268.        1. Optionally create the table with `CREATE TABLE'. For example,
  269.           using `mysql' or Perl-DBI.
  270.        2. Execute a `FLUSH TABLES' statement or the shell command
  271.           `mysqladmin flush-tables'.
  272.        3. Use `myisamchk --keys-used=0 -rq /path/to/db/tbl_name'. This
  273.           will remove all usage of all indexes from the table.
  274.        4. Insert data into the table with `LOAD DATA INFILE'. This will
  275.           not update any indexes and will therefore be very fast.
  276.        5. If you are going to only read the table in the future, run
  277.           `myisampack' on it to make it smaller. *Note Compressed
  278.           format::.
  279.        6. Re-create the indexes with `myisamchk -r -q
  280.           /path/to/db/tbl_name'. This will create the index tree in
  281.           memory before writing it to disk, which is much faster
  282.           because it avoids lots of disk seeks. The resulting index
  283.           tree is also perfectly balanced.
  284.        7. Execute a `FLUSH TABLES' statement or the shell command
  285.           `mysqladmin flush-tables'.
  286.      This procedure will be built into `LOAD DATA INFILE' in some future
  287.      version of MySQL.
  288.    * You can speed up insertions by locking your tables:
  289.           mysql> LOCK TABLES a WRITE;
  290.           mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
  291.           mysql> INSERT INTO a VALUES (8,26),(6,29);
  292.           mysql> UNLOCK TABLES;
  293.      The main speed difference is that the index buffer is flushed to
  294.      disk only once, after all `INSERT' statements have completed.
  295.      Normally there would be as many index buffer flushes as there are
  296.      different `INSERT' statements. Locking is not needed if you can
  297.      insert all rows with a single statement.
  298.      Locking will also lower the total time of multi-connection tests,
  299.      but the maximum wait time for some threads will go up (because
  300.      they wait for locks).  For example:
  301.           thread 1 does 1000 inserts
  302.           thread 2, 3, and 4 does 1 insert
  303.           thread 5 does 1000 inserts
  304.      If you don't use locking, 2, 3, and 4 will finish before 1 and 5.
  305.      If you use locking, 2, 3, and 4 probably will not finish before 1
  306.      or 5, but the total time should be about 40% faster.
  307.      As `INSERT', `UPDATE', and `DELETE' operations are very fast in
  308.      *MySQL*, you will obtain better overall performance by adding
  309.      locks around everything that does more than about 5 inserts or
  310.      updates in a row.  If you do very many inserts in a row, you could
  311.      do a `LOCK TABLES' followed by an `UNLOCK TABLES' once in a while
  312.      (about each 1000 rows) to allow other threads access to the table.
  313.      This would still result in a nice performance gain.
  314.      Of course, `LOAD DATA INFILE' is much faster for loading data.
  315. To get some more speed for both `LOAD DATA INFILE' and `INSERT',
  316. enlarge the key buffer. *Note Server parameters::.
  317. Speed of `UPDATE' Queries
  318. -------------------------
  319. Update queries are optimized as a `SELECT' query with the additional
  320. overhead of a write. The speed of the write is dependent on the size of
  321. the data that is being updated and the number of indexes that are
  322. updated.  Indexes that are not changed will not be updated.
  323. Also, another way to get fast updates is to delay updates and then do
  324. many updates in a row later. Doing many updates in a row is much quicker
  325. than doing one at a time if you lock the table.
  326. Note that, with dynamic record format, updating a record to a longer
  327. total length may split the record.  So if you do this often, it is very
  328. important to `OPTIMIZE TABLE' sometimes.  *Note `OPTIMIZE TABLE':
  329. OPTIMIZE TABLE.
  330. Speed of `DELETE' Queries
  331. -------------------------
  332. If you want to delete all rows in the table, you should use `TRUNCATE
  333. TABLE table_name'. *Note TRUNCATE::.
  334. The time to delete a record is exactly proportional to the number of
  335. indexes. To delete records more quickly, you can increase the size of
  336. the index cache. *Note Server parameters::.
  337. Other Optimization Tips
  338. =======================
  339. Unsorted tips for faster systems:
  340.    * Use persistent connections to the database to avoid the connection
  341.      overhead. If you can't use persistent connections and you are
  342.      doing a lot of new connections to the database, you may want to
  343.      change the value of the `thread_cache_size' variable. *Note Server
  344.      parameters::.
  345.    * Always check that all your queries really use the indexes you have
  346.      created in the tables. In *MySQL* you can do this with the
  347.      `EXPLAIN' command. *Note Explain: (manual)EXPLAIN.
  348.    * Try to avoid complex `SELECT' queries on tables that are updated a
  349.      lot. This is to avoid problems with table locking.
  350.    * The new `MyISAM' tables can insert rows in a table without deleted
  351.      rows at the same time another table is reading from it.  If this
  352.      is important for you, you should consider methods where you don't
  353.      have to delete rows or run `OPTIMIZE TABLE' after you have deleted
  354.      a lot of rows.
  355.    * Use `ALTER TABLE ... ORDER BY expr1,expr2...' if you mostly
  356.      retrieve rows in expr1,expr2.. order.  By using this option after
  357.      big changes to the table, you may be able to get higher
  358.      performance.
  359.    * In some cases it may make sense to introduce a column that is
  360.      'hashed' based on information from other columns. If this column
  361.      is short and reasonably unique it may be much faster than a big
  362.      index on many columns. In *MySQL* it's very easy to use this extra
  363.      column: `SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2))
  364.      AND col_1='constant' AND col_2='constant''
  365.    * For tables that change a lot you should try to avoid all `VARCHAR'
  366.      or `BLOB' columns. You will get dynamic row length as soon as you
  367.      are using a single `VARCHAR' or `BLOB' column. *Note Table types::.
  368.    * It's not normally useful to split a table into different tables
  369.      just because the rows gets 'big'. To access a row, the biggest
  370.      performance hit is the disk seek to find the first byte of the
  371.      row. After finding the data most new disks can read the whole row
  372.      fast enough for most applications. The only cases where it really
  373.      matters to split up a table is if it's a dynamic row size table
  374.      (see above) that you can change to a fixed row size, or if you
  375.      very often need to scan the table and don't need most of the
  376.      columns. *Note Table types::.
  377.    * If you very often need to calculate things based on information
  378.      from a lot of rows (like counts of things), it's probably much
  379.      better to introduce a new table and update the counter in real
  380.      time. An update of type `UPDATE table set count=count+1 where
  381.      index_column=constant' is very fast!
  382.      This is really important when you use databases like *MySQL* that
  383.      only have table locking (multiple readers / single writers). This
  384.      will also give better performance with most databases, as the row
  385.      locking manager in this case will have less to do.
  386.    * If you need to collect statistics from big log tables, use summary
  387.      tables instead of scanning the whole table. Maintaining the
  388.      summaries should be much faster than trying to do statistics
  389.      'live'. It's much faster to regenerate new summary tables from the
  390.      logs when things change (depending on business decisions) than to
  391.      have to change the running application!
  392.    * If possible, one should classify reports as 'live' or
  393.      'statistical', where data needed for statistical reports are only
  394.      generated based on summary tables that are generated from the
  395.      actual data.
  396.    * Take advantage of the fact that columns have default values. Insert
  397.      values explicitly only when the value to be inserted differs from
  398.      the default. This reduces the parsing that *MySQL* need to do and
  399.      improves the insert speed.
  400.    * In some cases it's convenient to pack and store data into a blob.
  401.      In this case you have to add some extra code in your appliction to
  402.      pack/unpack things in the blob, but this may save a lot of
  403.      accesses at some stage.  This is practical when you have data that
  404.      doesn't conform to a static table structure.
  405.    * Normally you should try to keep all data non-redundant (what is
  406.      called 3rd normal form in database theory), but you should not be
  407.      afraid of duplicating things or creating summary tables if you
  408.      need these to gain more speed.
  409.    * Stored procedures or UDF (user-defined functions) may be a good
  410.      way to get more performance.  In this case you should, however,
  411.      always have a way to do this some other (slower) way if you use
  412.      some database that doesn't support this.
  413.    * You can always gain something by caching queries/answers in your
  414.      application and trying to do many inserts/updates at the same
  415.      time.  If your database supports lock tables (like *MySQL* and
  416.      Oracle), this should help to ensure that the index cache is only
  417.      flushed once after all updates.
  418.    * Use `INSERT /*! DELAYED */' when you do not need to know when your
  419.      data is written. This speeds things up because many records can be
  420.      written with a single disk write.
  421.    * Use `INSERT /*! LOW_PRIORITY */' when you want your selects to be
  422.      more important.
  423.    * Use `SELECT /*! HIGH_PRIORITY */' to get selects that jump the
  424.      queue. That is, the select is done even if there is somebody
  425.      waiting to do a write.
  426.    * Use the multi-line `INSERT' statement to store many rows with one
  427.      SQL command (many SQL servers supports this).
  428.    * Use `LOAD DATA INFILE' to load bigger amounts of data. This is
  429.      faster than normal inserts and will be even faster when `myisamchk'
  430.      is integrated in `mysqld'.
  431.    * Use `AUTO_INCREMENT' columns to make unique values.
  432.    * Use `OPTIMIZE TABLE' once in a while to avoid fragmentation when
  433.      using dynamic table format. *Note `OPTIMIZE TABLE': OPTIMIZE TABLE.
  434.    * Use `HEAP' tables to get more speed when possible. *Note Table
  435.      types::.
  436.    * When using a normal Web server setup, images should be stored as
  437.      files. That is, store only a file reference in the database.  The
  438.      main reason for this is that a normal Web server is much better at
  439.      caching files than database contents. So it it's much easier to
  440.      get a fast system if you are using files.
  441.    * Use in memory tables for non-critical data that are accessed often
  442.      (like information about the last shown banner for users that don't
  443.      have cookies).
  444.    * Columns with identical information in different tables should be
  445.      declared identical and have identical names. Before Version 3.23
  446.      you got slow joins otherwise.
  447.      Try to keep the names simple (use `name' instead of
  448.      `customer_name' in the customer table). To make your names portable
  449.      to other SQL servers you should keep them shorter than 18
  450.      characters.
  451.    * If you need REALLY high speed, you should take a look at the
  452.      low-level interfaces for data storage that the different SQL
  453.      servers support!  For example, by accessing the *MySQL* `MyISAM'
  454.      directly, you could get a speed increase of 2-5 times compared to
  455.      using the SQL interface.  To be able to do this the data must be
  456.      on the same server as the application, and usually it should only
  457.      be accessed by one process (because external file locking is
  458.      really slow).  One could eliminate the above problems by
  459.      introducing low-level `MyISAM' commands in the *MySQL* server
  460.      (this could be one easy way to get more performance if needed).
  461.      By carefully designing the database interface, it should be quite
  462.      easy to support this types of optimization.
  463.    * In many cases it's faster to access data from a database (using a
  464.      live connection) than accessing a text file, just because the
  465.      database is likely to be more compact than the text file (if you
  466.      are using numerical data), and this will involve fewer disk
  467.      accesses.  You will also save code because you don't have to parse
  468.      your text files to find line and column boundaries.
  469.    * You can also use replication to speed things up. *Note
  470.      Replication::.
  471.    * Declaring a table with `DELAY_KEY_WRITE=1' will make the updating
  472.      of indexes faster, as these are not logged to disk until the file
  473.      is closed.  The downside is that you should run `myisamchk' on
  474.      these tables before you start `mysqld' to ensure that they are
  475.      okay if something killed `mysqld' in the middle.  As the key
  476.      information can always be generated from the data, you should not
  477.      lose anything by using `DELAY_KEY_WRITE'.
  478. Using Your Own Benchmarks
  479. =========================
  480. You should definately benchmark your application and database to find
  481. out where the bottlenecks are.  By fixing it (or by replacing the
  482. bottleneck with a 'dummy module') you can then easily identify the next
  483. bottleneck (and so on).  Even if the overall performance for your
  484. application is sufficient, you should at least make a plan for each
  485. bottleneck, and decide how to solve it if someday you really need the
  486. extra performance.
  487. For an example of portable benchmark programs, look at the *MySQL*
  488. benchmark suite. *Note *MySQL* Benchmarks: MySQL Benchmarks. You can
  489. take any program from this suite and modify it for your needs. By doing
  490. this, you can try different solutions to your problem and test which is
  491. really the fastest solution for you.
  492. It is very common that some problems only occur when the system is very
  493. heavily loaded. We have had many customers who contact us when they
  494. have a (tested) system in production and have encountered load
  495. problems. In every one of these cases so far, it has been problems with
  496. basic design (table scans are NOT good at high load) or OS/Library
  497. issues. Most of this would be a *LOT* easier to fix if the systems were
  498. not already in production.
  499. To avoid problems like this, you should put some effort into
  500. benchmarking your whole application under the worst possible load! You
  501. can use Sasha's recent hack for this - super-smack
  502. (http://www.mysql.com/Downloads/super-smack/super-smack-1.0.tar.gz).
  503. As the name suggests, it can bring your system down to its knees if you
  504. ask it, so make sure to use it only on your developement systems.
  505. Design Choices
  506. ==============
  507. *MySQL* keeps row data and index data in separate files. Many (almost
  508. all) other databases mix row and index data in the same file. We
  509. believe that the *MySQL* choice is better for a very wide range of
  510. modern systems.
  511. Another way to store the row data is to keep the information for each
  512. column in a separate area (examples are SDBM and Focus). This will
  513. cause a performance hit for every query that accesses more than one
  514. column. Because this degenerates so quickly when more than one column
  515. is accessed, we believe that this model is not good for general purpose
  516. databases.
  517. The more common case is that the index and data are stored together
  518. (like in Oracle/Sybase et al). In this case you will find the row
  519. information at the leaf page of the index. The good thing with this
  520. layout is that it, in many cases, depending on how well the index is
  521. cached, saves a disk read.  The bad things with this layout are:
  522.    * Table scanning is much slower because you have to read through the
  523.      indexes to get at the data.
  524.    * You can't use only the index table to retrieve data for a query.
  525.    * You lose a lot of space, as you must duplicate indexes from the
  526.      nodes (as you can't store the row in the nodes).
  527.    * Deletes will degenerate the table over time (as indexes in nodes
  528.      are usually not updated on delete).
  529.    * It's harder to cache ONLY the index data.
  530. MySQL Design Limitations/Tradeoffs
  531. ==================================
  532. Because *MySQL* uses extremely fast table locking (multiple readers /
  533. single writers) the biggest remaining problem is a mix of a steady
  534. stream of inserts and slow selects on the same table.
  535. We believe that for a huge number of systems the extremely fast
  536. performance in other cases make this choice a win. This case is usually
  537. also possible to solve by having multiple copies of the table, but it
  538. takes more effort and hardware.
  539. We are also working on some extensions to solve this problem for some
  540. common application niches.
  541. Portability
  542. ===========
  543. Because all SQL servers implement different parts of SQL, it takes work
  544. to write portable SQL applications. For very simple selects/inserts it
  545. is very easy, but the more you need the harder it gets. If you want an
  546. application that is fast with many databases it becomes even harder!
  547. To make a complex application portable you need to choose a number of
  548. SQL servers that it should work with.
  549. You can use the *MySQL* crash-me program/web-page
  550. `http://www.mysql.com/information/crash-me.php' to find functions,
  551. types, and limits you can use with a selection of database servers.
  552. Crash-me now tests far from everything possible, but it is still
  553. comprehensive with about 450 things tested.
  554. For example, you shouldn't have column names longer than 18 characters
  555. if you want to be able to use Informix or DB2.
  556. Both the *MySQL* benchmarks and crash-me programs are very
  557. database-independent.  By taking a look at how we have handled this, you
  558. can get a feeling for what you have to do to write your application
  559. database-independent.  The benchmarks themselves can be found in the
  560. `sql-bench' directory in the *MySQL* source distribution. They are
  561. written in Perl with DBI database interface (which solves the access
  562. part of the problem).
  563. See `http://www.mysql.com/information/benchmarks.html' for the results
  564. from this benchmark.
  565. As you can see in these results, all databases have some weak points.
  566. That is, they have different design compromises that lead to different
  567. behavior.
  568. If you strive for database independence, you need to get a good feeling
  569. for each SQL server's bottlenecks. *MySQL* is VERY fast in retrieving
  570. and updating things, but will have a problem in mixing slow
  571. readers/writers on the same table. Oracle, on the other hand, has a big
  572. problem when you try to access rows that you have recently updated
  573. (until they are flushed to disk). Transaction databases in general are
  574. not very good at generating summary tables from log tables, as in this
  575. case row locking is almost useless.
  576. To get your application _really_ database-independent, you need to
  577. define an easy extendable interface through which you manipulate your
  578. data. As C++ is available on most systems, it makes sense to use a C++
  579. classes interface to the databases.
  580. If you use some specific feature for some database (like the `REPLACE'
  581. command in *MySQL*), you should code a method for the other SQL servers
  582. to implement the same feature (but slower).  With *MySQL* you can use
  583. the `/*!  */' syntax to add *MySQL*-specific keywords to a query.  The
  584. code inside `/**/' will be treated as a comment (ignored) by most other
  585. SQL servers.
  586. If REAL high performance is more important than exactness, as in some
  587. Web applications, a possibility is to create an application layer that
  588. caches all results to give you even higher performance. By letting old
  589. results 'expire' after a while, you can keep the cache reasonably
  590. fresh.  This is quite nice in case of extremely high load, in which case
  591. you can dynamically increase the cache and set the expire timeout higher
  592. until things get back to normal.
  593. In this case the table creation information should contain information
  594. of the initial size of the cache and how often the table should normally
  595. be refreshed.
  596. What Have We Used MySQL For?
  597. ============================
  598. During *MySQL* initial development, the features of *MySQL* were made
  599. to fit our largest customer. They handle data warehousing for a couple
  600. of the biggest retailers in Sweden.
  601. From all stores, we get weekly summaries of all bonus card transactions,
  602. and we are expected to provide useful information for the store owners
  603. to help them find how their advertisement campaigns are affecting their
  604. customers.
  605. The data is quite huge (about 7 million summary transactions per month),
  606. and we have data for 4-10 years that we need to present to the users.
  607. We got weekly requests from the customers that they want to get
  608. 'instant' access to new reports from this data.
  609. We solved this by storing all information per month in compressed
  610. 'transaction' tables. We have a set of simple macros (script) that
  611. generates summary tables grouped by different criteria (product group,
  612. customer id, store ...) from the transaction tables.  The reports are
  613. Web pages that are dynamically generated by a small Perl script that
  614. parses a Web page, executes the SQL statements in it, and inserts the
  615. results. We would have used PHP or mod_perl instead but they were not
  616. available at that time.
  617. For graphical data we wrote a simple tool in `C' that can produce GIFs
  618. based on the result of a SQL query (with some processing of the
  619. result). This is also dynamically executed from the Perl script that
  620. parses the `HTML' files.
  621. In most cases a new report can simply be done by copying an existing
  622. script and modifying the SQL query in it.  In some cases, we will need
  623. to add more fields to an existing summary table or generate a new one,
  624. but this is also quite simple, as we keep all transactions tables on
  625. disk.  (Currently we have at least 50G of transactions tables and 200G
  626. of other customer data.)
  627. We also let our customers access the summary tables directly with ODBC
  628. so that the advanced users can themselves experiment with the data.
  629. We haven't had any problems handling this with quite modest Sun Ultra
  630. SPARCstation (2x200 Mhz). We recently upgraded one of our servers to a 2
  631. CPU 400 Mhz UltraSPARC, and we are now planning to start handling
  632. transactions on the product level, which would mean a ten-fold increase
  633. of data. We think we can keep up with this by just adding more disk to
  634. our systems.
  635. We are also experimenting with Intel-Linux to be able to get more CPU
  636. power cheaper. Now that we have the binary portable database format (new
  637. in Version 3.23), we will start to use this for some parts of the
  638. application.
  639. Our initial feelings are that Linux will perform much better on
  640. low-to-medium load and Solaris will perform better when you start to
  641. get a high load because of extreme disk IO, but we don't yet have
  642. anything conclusive about this. After some discussion with a Linux
  643. Kernel developer, this might be a side effect of Linux giving so much
  644. resources to the batch job that the interactive performance gets very
  645. low. This makes the machine feel very slow and unresponsive while big
  646. batches are going. Hopefully this will be better handled in future
  647. Linux Kernels.
  648. The MySQL Benchmark Suite
  649. *************************
  650. This should contain a technical description of the *MySQL* benchmark
  651. suite (and `crash-me'), but that description is not written yet.
  652. Currently, you can get a good idea of the benchmark by looking at the
  653. code and results in the `sql-bench' directory in any *MySQL* source
  654. distributions.
  655. This benchmark suite is meant to be a benchmark that will tell any user
  656. what things a given SQL implementation performs well or poorly at.
  657. Note that this benchmark is single threaded, so it measures the minimum
  658. time for the operations. We plan to in the future add a lot of
  659. multi-threaded tests to the benchmark suite.
  660. For example, (run on the same NT 4.0 machine):
  661. *Reading 2000000 rows by index* *Seconds*                                   *Seconds*      
  662. mysql                                       367            249
  663. mysql_odbc                                  464            
  664. db2_odbc                                    1206           
  665. informix_odbc                               121126         
  666. ms-sql_odbc                                 1634           
  667. oracle_odbc                                 20800          
  668. solid_odbc                                  877            
  669. sybase_odbc                                 17614          
  670. *Inserting (350768) rows* *Seconds*                                   *Seconds*      
  671. mysql                                       381            206
  672. mysql_odbc                                  619            
  673. db2_odbc                                    3460           
  674. informix_odbc                               2692           
  675. ms-sql_odbc                                 4012           
  676. oracle_odbc                                 11291          
  677. solid_odbc                                  1801           
  678. sybase_odbc                                 4802           
  679. In the above test *MySQL* was run with a 8M index cache.
  680. We have gather some more benchmark results at
  681. `http://www.mysql.com/information/benchmarks.html'.
  682. Note that Oracle is not included because they asked to be removed. All
  683. Oracle benchmarks have to be passed by Oracle! We believe that makes
  684. Oracle benchmarks *VERY* biased because the above benchmarks are
  685. supposed to show what a standard installation can do for a single
  686. client.
  687. To run the benchmark suite, you have to download a MySQL source
  688. distribution install the perl DBI driver, the perl DBD driver for the
  689. database you want to test and then do:
  690.      cd sql-bench
  691.      perl run-all-tests --server=#
  692. where # is one of supported servers. You can get a list of all options
  693. and supported servers by doing `run-all-tests --help'.
  694. `crash-me' tries to determine what features a database supports and
  695. what it's capabilities and limitations are by actually running queries.
  696. For example, it determines:
  697.    * What column types are supported
  698.    * How many indexes are supported
  699.    * What functions are supported
  700.    * How big a query can be
  701.    * How big a `VARCHAR' column can be
  702. We can find the result from crash-me on a lot of different databases at
  703. `http://www.mysql.com/information/crash-me.php'.
  704. MySQL Utilites
  705. **************
  706. Overview of the Different MySQL Programs
  707. ========================================
  708. All *MySQL* clients that communicate with the server using the
  709. `mysqlclient' library use the following environment variables:
  710. *Name*             *Description*
  711. `MYSQL_UNIX_PORT'  The default socket; used for connections to
  712.                    `localhost'
  713. `MYSQL_TCP_PORT'   The default TCP/IP port
  714. `MYSQL_PWD'        The default password
  715. `MYSQL_DEBUG'      Debug-trace options when debugging
  716. `TMPDIR'           The directory where temporary tables/files are created
  717. Use of `MYSQL_PWD' is insecure.  *Note Connecting::.
  718. The `mysql' client uses the file named in the `MYSQL_HISTFILE'
  719. environment variable to save the command-line history. The default
  720. value for the history file is `$HOME/.mysql_history', where `$HOME' is
  721. the value of the `HOME' environment variable. *Note Environment
  722. variables::.
  723. All *MySQL* programs take many different options. However, every
  724. *MySQL* program provides a `--help' option that you can use to get a
  725. full description of the program's different options. For example, try
  726. `mysql --help'.
  727. You can override default options for all standard client programs with
  728. an option file. *Note Option files::.
  729. The list below briefly describes the *MySQL* programs:
  730. `myisamchk'
  731.      Utility to describe, check, optimize, and repair *MySQL* tables.
  732.      Because `myisamchk' has many functions, it is described in its own
  733.      chapter. *Note Maintenance::.
  734. `make_binary_distribution'
  735.      Makes a binary release of a compiled *MySQL*. This could be sent
  736.      by FTP to `/pub/mysql/Incoming' on `support.mysql.com' for the
  737.      convenience of other *MySQL* users.
  738. `msql2mysql'
  739.      A shell script that converts `mSQL' programs to *MySQL*. It doesn't
  740.      handle all cases, but it gives a good start when converting.
  741. `mysqlaccess'
  742.      A script that checks the access privileges for a host, user, and
  743.      database combination.
  744. `mysqladmin'
  745.      Utility for performing administrative operations, such as creating
  746.      or dropping databases, reloading the grant tables, flushing tables
  747.      to disk, and reopening log files.  `mysqladmin' can also be used
  748.      to retrieve version, process, and status information from the
  749.      server.  *Note `mysqladmin': mysqladmin.
  750. `mysqlbug'
  751.      The *MySQL* bug report script.  This script should always be used
  752.      when filing a bug report to the *MySQL* list.
  753. `mysqld'
  754.      The SQL daemon. This should always be running.
  755. `mysqldump'
  756.      Dumps a *MySQL* database into a file as SQL statements or as
  757.      tab-separated text files. Enhanced freeware originally by Igor
  758.      Romanenko.  *Note `mysqldump': mysqldump.
  759. `mysqlimport'
  760.      Imports text files into their respective tables using `LOAD DATA
  761.      INFILE'. *Note `mysqlimport': mysqlimport.
  762. `mysqlshow'
  763.      Displays information about databases, tables, columns, and indexes.
  764. `mysql_install_db'
  765.      Creates the *MySQL* grant tables with default privileges. This is
  766.      usually executed only once, when first installing *MySQL* on a
  767.      system.
  768. `replace'
  769.      A utility program that is used by `msql2mysql', but that has more
  770.      general applicability as well.  `replace' changes strings in place
  771.      in files or on the standard input. Uses a finite state machine to
  772.      match longer strings first. Can be used to swap strings. For
  773.      example, this command swaps `a' and `b' in the given files:
  774.           shell> replace a b b a -- file1 file2 ...
  775. safe_mysqld, the wrapper around mysqld
  776. ======================================
  777. `safe_mysqld' is the recommended way to start a `mysqld' daemon on
  778. Unix.  `safe_mysqld' adds some safety features such as restarting the
  779. server when an error occurs and logging run-time information to a log
  780. file.
  781. Normally one should never edit the `safe_mysqld' script, but instead
  782. put the options to `safe_mysqld' in the `[safe_mysqld]' section in the
  783. `my.cnf' file. `safe_mysqld' will read all options from the `[mysqld]',
  784. `[server]' and `[safe_mysqld]' sections from the option files.  *Note
  785. Option files::.
  786. Note that all options on the command line to `safe_mysqld' are passed
  787. to `mysqld'.  If you wants to use any options in `safe_mysqld' that
  788. `mysqld' doesn't support, you must specify these in the option file.
  789. Most of the options to `safe_mysqld' are the same as the options to
  790. `mysqld'. *Note Command-line options::.
  791. `safe_mysqld' supports the following options:
  792. `--basedir=path'
  793. `--core-file-size=#'
  794.      Size of the core file `mysqld' should be able to create. Passed to
  795.      `ulimit -c'.
  796. `--datadir=path'
  797. `--defaults-extra-file=path'
  798. `--defaults-file=path'
  799. `--err-log=path'
  800. `--ledir=path'
  801.      Path to `mysqld'
  802. `--log=path'
  803. `--mysqld=mysqld-version'
  804.      Name of the mysqld version in the `ledir' directory you want to
  805.      start.
  806. `--no-defaults'
  807. `--open-files-limit=#'
  808.      Number of files `mysqld' should be able to open. Passed to `ulimit
  809.      -n'. Note that you need to start `safe_mysqld' as root for this to
  810.      work properly!
  811. `--pid-file=path'
  812. `--port=#'
  813. `--socket=path'
  814. `--timezone=#'
  815.      Set the timezone (the `TZ') variable to the value of this
  816.      parameter.
  817. `--user=#'
  818. The `safe_mysqld' script is written so that it normally is able to start
  819. a server that was installed from either a source or a binary version of
  820. *MySQL*, even if these install the server in slightly different
  821. locations.  `safe_mysqld' expects one of these conditions to be true:
  822.    * The server and databases can be found relative to the directory
  823.      from which `safe_mysqld' is invoked.  `safe_mysqld' looks under
  824.      its working directory for `bin' and `data' directories (for binary
  825.      distributions) or for `libexec' and `var' directories (for source
  826.      distributions).  This condition should be met if you execute
  827.      `safe_mysqld' from your *MySQL* installation directory (for
  828.      example, `/usr/local/mysql' for a binary distribution).
  829.    * If the server and databases cannot be found relative to the
  830.      working directory, `safe_mysqld' attempts to locate them by
  831.      absolute pathnames.  Typical locations are `/usr/local/libexec'
  832.      and `/usr/local/var'.  The actual locations are determined when
  833.      the distribution was built from which `safe_mysqld' comes.  They
  834.      should be correct if *MySQL* was installed in a standard location.
  835. Because `safe_mysqld' will try to find the server and databases relative
  836. to its own working directory, you can install a binary distribution of
  837. *MySQL* anywhere, as long as you start `safe_mysqld' from the *MySQL*
  838. installation directory:
  839.      shell> cd mysql_installation_directory
  840.      shell> bin/safe_mysqld &
  841. If `safe_mysqld' fails, even when invoked from the *MySQL* installation
  842. directory, you can modify it to use the path to `mysqld' and the
  843. pathname options that are correct for your system.  Note that if you
  844. upgrade *MySQL* in the future, your modified version of `safe_mysqld'
  845. will be overwritten, so you should make a copy of your edited version
  846. that you can reinstall.
  847. mysqld_multi, program for managing multiple *MySQL* servers
  848. ===========================================================
  849. `mysqld_multi' is meant for managing several `mysqld' processes running
  850. in different UNIX sockets and TCP/IP ports.
  851. The program will search for group(s) named [mysqld#] from my.cnf (or the
  852. given -config-file=...), where # can be any positive number starting
  853. from 1. These groups should be the same as the usual `[mysqld]' group
  854. (e.g. options to mysqld, see *MySQL* manual for detailed information
  855. about this group), but with those port, socket etc. options that are
  856. wanted for each separate `mysqld' processes. The number in the group
  857. name has another function; it can be used for starting, stopping, or
  858. reporting some specific `mysqld' servers with this program. See the
  859. usage and options below for more information.
  860.      Usage: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...]
  861.      or     mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]
  862. The GNR above means the group number. You can start, stop or report any
  863. GNR, or several of them at the same time. (See -example) The GNRs list
  864. can be comma separated, or a dash combined, of which the latter means
  865. that all the GNRs between GNR1-GNR2 will be affected. Without GNR
  866. argument all the found groups will be either started, stopped, or
  867. reported. Note that you must not have any white spaces in the GNR list.
  868. Anything after a white space are ignored.
  869. `mysqld_multi' supports the following options:
  870. `--config-file=...'
  871.      Alternative config file. NOTE: This will not affect this program's
  872.      own options (group `[mysqld_multi]'), but only groups [mysqld#].
  873.      Without this option everything will be searched from the ordinary
  874.      my.cnf file.
  875. `--example'
  876.      Give an example of a config file.
  877. `--help'
  878.      Print this help and exit.
  879. `--log=...'
  880.      Log file. Full path to and the name for the log file. NOTE: If the
  881.      file exists, everything will be appended.
  882. `--mysqladmin=...'
  883.      `mysqladmin' binary to be used for a server shutdown.
  884. `--mysqld=...'
  885.      `mysqld' binary to be used. Note that you can give `safe_mysqld'
  886.      to this option also. The options are passed to `mysqld'. Just make
  887.      sure you have `mysqld' in your environment variable `PATH' or fix
  888.      `safe_mysqld'.
  889. `--no-log'
  890.      Print to stdout instead of the log file. By default the log file is
  891.      turned on.
  892. `--password=...'
  893.      Password for user for `mysqladmin'.
  894. `--tcp-ip'
  895.      Connect to the *MySQL* server(s) via the TCP/IP port instead of
  896.      the UNIX socket. This affects stopping and reporting.  If a socket
  897.      file is missing, the server may still be running, but can be
  898.      accessed only via the TCP/IP port.  By default connecting is done
  899.      via the UNIX socket.
  900. `--user=...'
  901.      *MySQL* user for `mysqladmin'.
  902. `--version'
  903.      Print the version number and exit.
  904. Some notes about `mysqld_multi':
  905.    * Make sure that the *MySQL* user, who is stopping the `mysqld'
  906.      services (e.g using the `mysqladmin') have the same password and
  907.      username for all the data directories accessed (to the 'mysql'
  908.      database) And make sure that the user has the 'Shutdown_priv'
  909.      privilege! If you have many data- directories and many different
  910.      'mysql' databases with different passwords for the *MySQL* 'root'
  911.      user, you may want to create a common 'multi_admin' user for each
  912.      using the same password (see below). Example how to do it:
  913.           shell> mysql -u root -S /tmp/mysql.sock -proot_password -e
  914.           "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'multipass'"
  915.           *Note Privileges::.
  916.      You will have to do the above for each `mysqld' running in each
  917.      data directory, that you have (just change the socket, -S=...)
  918.    * `pid-file' is very important, if you are using `safe_mysqld' to
  919.      start `mysqld' (e.g. -mysqld=safe_mysqld) Every `mysqld' should
  920.      have it's own `pid-file'. The advantage using `safe_mysqld'
  921.      instead of `mysqld' directly here is, that `safe_mysqld' 'guards'
  922.      every `mysqld' process and will restart it, if a `mysqld' process
  923.      fails due to signal kill -9, or similar. (Like segmentation fault,
  924.      which *MySQL* should never do, of course ;) Please note that
  925.      `safe_mysqld' script may require that you start it from a certain
  926.      place. This means that you may have to CD to a certain directory,
  927.      before you start the `mysqld_multi'. If you have problems
  928.      starting, please see the `safe_mysqld' script. Check especially
  929.      the lines:
  930.           --------------------------------------------------------------------------
  931.           MY_PWD=`pwd` Check if we are starting this relative (for the binary
  932.           release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys
  933.           -a -x ./bin/mysqld
  934.           --------------------------------------------------------------------------
  935.           *Note safe_mysqld::.
  936.      The above test should be successful, or you may encounter problems.
  937.    * Beware of the dangers starting multiple `mysqlds' in the same data
  938.      directory.  Use separate data directories, unless you *KNOW* what
  939.      you are doing!
  940.    * The socket file and the TCP/IP port must be different for every
  941.      `mysqld'.
  942.    * The first and fifth `mysqld' group were intentionally left out from
  943.      the example.  You may have 'gaps' in the config file. This gives
  944.      you more flexibility.  The order in which the `mysqlds' are
  945.      started or stopped depends on the order in which they appear in
  946.      the config file.
  947.    * When you want to refer to a certain group using GNR with this
  948.      program, just use the number in the end of the group name (
  949.      [mysqld# <== ).
  950.    * You may want to use option '-user' for `mysqld', but in order to
  951.      do this you need to be root when you start the `mysqld_multi'
  952.      script. Having the option in the config file doesn't matter; you
  953.      will just get a warning, if you are not the superuser and the
  954.      `mysqlds' are started under *YOUR* UNIX account. *IMPORTANT*: Make
  955.      sure that the `pid-file' and the data directory are
  956.      read+write(+execute for the latter one) accessible for *THAT* UNIX
  957.      user, who the specific `mysqld' process is started as. *DON'T* use
  958.      the UNIX root account for this, unless you *KNOW* what you are
  959.      doing!
  960.    * *MOST IMPORTANT*: Make sure that you understand the meanings of
  961.      the options that are passed to the `mysqlds' and why *WOULD YOU
  962.      WANT* to have separate `mysqld' processes. Starting multiple
  963.      `mysqlds' in one data directory *WILL NOT* give you extra
  964.      performance in a threaded system!
  965. *Note Multiple servers::.
  966. This is an example of the config file on behalf of `mysqld_multi'.
  967.      # This file should probably be in your home dir (~/.my.cnf) or /etc/my.cnf
  968.      # Version 2.1 by Jani Tolonen
  969.      
  970.      [mysqld_multi]
  971.      mysqld     = /usr/local/bin/safe_mysqld
  972.      mysqladmin = /usr/local/bin/mysqladmin
  973.      user       = multi_admin
  974.      password   = multipass
  975.      
  976.      [mysqld2]
  977.      socket     = /tmp/mysql.sock2
  978.      port       = 3307
  979.      pid-file   = /usr/local/mysql/var2/hostname.pid2
  980.      datadir    = /usr/local/mysql/var2
  981.      language   = /usr/local/share/mysql/english
  982.      user       = john
  983.      
  984.      [mysqld3]
  985.      socket     = /tmp/mysql.sock3
  986.      port       = 3308
  987.      pid-file   = /usr/local/mysql/var3/hostname.pid3
  988.      datadir    = /usr/local/mysql/var3
  989.      language   = /usr/local/share/mysql/swedish
  990.      user       = monty
  991.      
  992.      [mysqld4]
  993.      socket     = /tmp/mysql.sock4
  994.      port       = 3309
  995.      pid-file   = /usr/local/mysql/var4/hostname.pid4
  996.      datadir    = /usr/local/mysql/var4
  997.      language   = /usr/local/share/mysql/estonia
  998.      user       = tonu
  999.      
  1000.      [mysqld6]
  1001.      socket     = /tmp/mysql.sock6
  1002.      port       = 3311
  1003.      pid-file   = /usr/local/mysql/var6/hostname.pid6
  1004.      datadir    = /usr/local/mysql/var6
  1005.      language   = /usr/local/share/mysql/japanese
  1006.      user       = jani
  1007. *Note Option files::.
  1008. The Command-line Tool
  1009. =====================
  1010. `mysql' is a simple SQL shell (with GNU `readline' capabilities).  It
  1011. supports interactive and non-interactive use. When used interactively,
  1012. query results are presented in an ASCII-table format. When used
  1013. non-interactively (for example, as a filter), the result is presented in
  1014. tab-separated format.  (The output format can be changed using
  1015. command-line options.)  You can run scripts simply like this:
  1016.      shell> mysql database < script.sql > output.tab
  1017. If you have problems due to insufficient memory in the client, use the
  1018. `--quick' option!  This forces `mysql' to use `mysql_use_result()'
  1019. rather than `mysql_store_result()' to retrieve the result set.
  1020. Using `mysql' is very easy. Just start it as follows: `mysql database'
  1021. or `mysql --user=user_name --password=your_password database'. Type a
  1022. SQL statement, end it with `;', `g', or `G' and press RETURN/ENTER.
  1023. `mysql' supports the following options:
  1024. `-?, --help'
  1025.      Display this help and exit.
  1026. `-A, --no-auto-rehash'
  1027.      No automatic rehashing. One has to use 'rehash' to get table and
  1028.      field completion. This gives a quicker start of mysql.
  1029. `-B, --batch'
  1030.      Print results with a tab as separator, each row on a new line.
  1031.      Doesn't use history file.
  1032. `--character-sets-dir=...'
  1033.      Directory where character sets are located.
  1034. `-C, --compress'
  1035.      Use compression in server/client protocol.
  1036. `-#, --debug[=...]'
  1037.      Debug log. Default is 'd:t:o,/tmp/mysql.trace'.
  1038. `-D, --database=...'
  1039.      Database to use. This is mainly useful in the `my.cnf' file.
  1040. `--default-character-set=...'
  1041.      Set the default character set.
  1042. `-e, --execute=...'
  1043.      Execute command and quit. (Output like with -batch)
  1044. `-E, --vertical'
  1045.      Print the output of a query (rows) vertically. Without this option
  1046.      you can also force this output by ending your statements with `G'.
  1047. `-f, --force'
  1048.      Continue even if we get a SQL error.
  1049. `-g, --no-named-commands'
  1050.      Named commands are disabled. Use * form only, or use named
  1051.      commands only in the beginning of a line ending with a semicolon
  1052.      (;). Since Version 10.9, the client now starts with this option
  1053.      ENABLED by default!  With the -g option, long format commands will
  1054.      still work from the first line, however.
  1055. `-G, --enable-named-commands'
  1056.      Named commands are *enabled*.  Long format commands are allowed as
  1057.      well as shortened * commands.
  1058. `-i, --ignore-space'
  1059.      Ignore space after function names.
  1060. `-h, --host=...'
  1061.      Connect to the given host.
  1062. `-H, --html'
  1063.      Produce HTML output.
  1064. `-L, --skip-line-numbers'
  1065.      Don't write line number for errors. Useful when one wants to
  1066.      compare result files that includes error messages
  1067. `--no-pager'
  1068.      Disable pager and print to stdout. See interactive help (h) also.
  1069. `--no-tee'
  1070.      Disable outfile. See interactive help (h) also.
  1071. `-n, --unbuffered'
  1072.      Flush buffer after each query.
  1073. `-N, --skip-column-names'
  1074.      Don't write column names in results.
  1075. `-O, --set-variable var=option'
  1076.      Give a variable a value. `--help' lists variables.
  1077. `-o, --one-database'
  1078.      Only update the default database. This is useful for skipping
  1079.      updates to other database in the update log.
  1080. ``--pager[=...]''
  1081.      Output type. Default is your `ENV' variable `PAGER'. Valid pagers
  1082.      are less, more, cat [> filename], etc.  See interactive help (h)
  1083.      also. This option does not work in batch mode. Pager works only in
  1084.      UNIX.
  1085. `-p[password], --password[=...]'
  1086.      Password to use when connecting to server. If a password is not
  1087.      given on the command line, you will be prompted for it.  Note that
  1088.      if you use the short form `-p' you can't have a space between the
  1089.      option and the password.
  1090. `-P  --port=...'
  1091.      TCP/IP port number to use for connection.
  1092. `-q, --quick'
  1093.      Don't cache result, print it row-by-row. This may slow down the
  1094.      server if the output is suspended. Doesn't use history file.
  1095. `-r, --raw'
  1096.      Write column values without escape conversion. Used with `--batch'
  1097. `-s, --silent'
  1098.      Be more silent.
  1099. `-S  --socket=...'
  1100.      Socket file to use for connection.
  1101. `-t  --table'
  1102.      Output in table format. This is default in non-batch mode.
  1103. `-T, --debug-info'
  1104.      Print some debug information at exit.
  1105. `--tee=...'
  1106.      Append everything into outfile. See interactive help (h) also.
  1107.      Does not work in batch mode.
  1108. `-u, --user=#'
  1109.      User for login if not current user.
  1110. `-U, --safe-updates[=#], --i-am-a-dummy[=#]'
  1111.      Only allow `UPDATE' and `DELETE' that uses keys. See below for
  1112.      more information about this option.  You can reset this option if
  1113.      you have it in your `my.cnf' file by using `--safe-updates=0'.
  1114. `-v, --verbose'
  1115.      More verbose output (-v -v -v gives the table output format).
  1116. `-V, --version'
  1117.      Output version information and exit.
  1118. `-w, --wait'
  1119.      Wait and retry if connection is down instead of aborting.
  1120. You can also set the following variables with `-O' or `--set-variable':
  1121. Variablename           Default        Description
  1122. connect_timeout        0              Number of seconds before timeout
  1123.                                       connection.
  1124. max_allowed_packet     16777216       Max packetlength to send/receive
  1125.                                       from to server
  1126. net_buffer_length      16384          Buffer for TCP/IP and socket
  1127.                                       communication
  1128. select_limit           1000           Automatic limit for SELECT when
  1129.                                       using -i-am-a-dummy
  1130. max_join_size          1000000        Automatic limit for rows in a join
  1131.                                       when using -i-am-a-dummy.
  1132. If you type 'help' on the command line, `mysql' will print out the
  1133. commands that it supports:
  1134.      mysql> help
  1135.      
  1136.      MySQL commands:
  1137.      help    (h)    Display this text.
  1138.      ?       (h)    Synonym for `help'.
  1139.      clear   (c)    Clear command.
  1140.      connect (r)    Reconnect to the server. Optional arguments are db and host.
  1141.      edit    (e)    Edit command with $EDITOR.
  1142.      ego     (G)    Send command to mysql server, display result vertically.
  1143.      exit    (q)    Exit mysql. Same as quit.
  1144.      go      (g)    Send command to mysql server.
  1145.      nopager (n)    Disable pager, print to stdout.
  1146.      notee   (t)    Don't write into outfile.
  1147.      pager   (P)    Set PAGER [to_pager]. Print the query results via PAGER.
  1148.      print   (p)    Print current command.
  1149.      quit    (q)    Quit mysql.
  1150.      rehash  (#)    Rebuild completion hash.
  1151.      source  (.)    Execute a SQL script file. Takes a file name as an argument.
  1152.      status  (s)    Get status information from the server.
  1153.      tee     (T)    Set outfile [to_outfile]. Append everything into given outfile.
  1154.      use     (u)    Use another database. Takes database name as argument.
  1155. From the above, pager only works in UNIX.
  1156. The `status' command gives you some information about the connection
  1157. and the server you are using. If you are running in the
  1158. `--safe-updates' mode, `status' will also print the values for the
  1159. `mysql' variables that affect your queries.
  1160. A useful startup option for beginners (introduced in *MySQL* Version
  1161. 3.23.11) is `--safe-mode' (or `--i-am-a-dummy' for users that has at
  1162. some time done a `DELETE FROM table_name' but forgot the `WHERE'
  1163. clause.  When using this option, `mysql' sends the following command to
  1164. the *MySQL* server when opening the connection:
  1165.      SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#,
  1166.          SQL_MAX_JOIN_SIZE=#max_join_size#"
  1167. where `#select_limit#' and `#max_join_size#' are variables that can be
  1168. set from the `mysql' command line. *Note `SET': SET OPTION.
  1169. The effect of the above is:
  1170.    * You are not allowed to do an `UPDATE' or `DELETE' statement if you
  1171.      don't have a key constraint in the `WHERE' part. One can, however,
  1172.      force an `UPDATE/DELETE' by using `LIMIT':
  1173.           UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1;
  1174.    * All big results are automatically limited to `#select_limit#' rows.
  1175.    * `SELECT''s that will probably need to examine more than
  1176.      `#max_join_size' row combinations will be aborted.
  1177. Some useful hints about the `mysql' client:
  1178. Some data is much more readable when displayed vertically, instead of
  1179. the usual horizontal box type output. For example longer text, which
  1180. includes new lines, is often much easier to be read with vertical
  1181. output.
  1182.      mysql> select * from mails where length(txt) < 300 limit 300,1G
  1183.      *************************** 1. row ***************************
  1184.        msg_nro: 3068
  1185.           date: 2000-03-01 23:29:50
  1186.      time_zone: +0200
  1187.      mail_from: Monty
  1188.          reply: monty@no.spam.com
  1189.        mail_to: "Thimble Smith" <tim@no.spam.com>
  1190.            sbj: UTF-8
  1191.            txt: >>>>> "Thimble" == Thimble Smith writes:
  1192.      
  1193.      Thimble> Hi.  I think this is a good idea.  Is anyone familiar with UTF-8
  1194.      Thimble> or Unicode?  Otherwise I'll put this on my TODO list and see what
  1195.      Thimble> happens.
  1196.      
  1197.      Yes, please do that.
  1198.      
  1199.      Regards,
  1200.      Monty
  1201.           file: inbox-jani-1
  1202.           hash: 190402944
  1203.      1 row in set (0.09 sec)
  1204.    * For logging, you can use the `tee' option. The `tee' can be
  1205.      started with option `--tee=...', or from the command line
  1206.      interactively with command `tee'. All the data displayed on the
  1207.      screen will also be appended into a given file. This can be very
  1208.      useful for debugging purposes also. The `tee' can be disabled from
  1209.      the command line with command `notee'. Executing `tee' again
  1210.      starts logging again. Without a parameter the previous file will be
  1211.      used. Note that `tee' will flush the results into the file after
  1212.      each command, just before the command line appears again waiting
  1213.      for the next command.
  1214.    * Browsing, or searching the results in the interactive mode in UNIX
  1215.      less, more, or any other similar program, is now possible with
  1216.      option `--pager[=...]'. Without argument, `mysql' client will look
  1217.      for environment variable PAGER and set `pager' to that.  `pager'
  1218.      can be started from the interactive command line with command
  1219.      `pager' and disabled with command `nopager'.  The command takes an
  1220.      argument optionally and the `pager' will be set to that. Command
  1221.      `pager' can be called without an argument, but this requires that
  1222.      the option `--pager' was used, or the `pager' will default to
  1223.      stdout. `pager' works only in UNIX, since it uses the popen()
  1224.      function, which doesn't exist in Windows. In Windows, the `tee'
  1225.      option can be used instead, although it may not be as handy as
  1226.      `pager' can be in some situations.
  1227.    * A few tips about `pager': You can use it to write to a file:
  1228.           mysql> pager cat > /tmp/log.txt
  1229.      and the results will only go to a file. You can also pass any
  1230.      options for the programs that you want to use with the `pager':
  1231.           mysql> pager less -n -i -S
  1232.      From the above do note the option '-S'. You may find it very
  1233.      useful when browsing the results; try the option with horizontal
  1234.      output (end commands with 'g', or ';') and with vertical output
  1235.      (end commands with 'G'). Sometimes a very wide result set is hard
  1236.      to be read from the screen, with option -S to less you can browse
  1237.      the results within the interactive less from left to right,
  1238.      preventing lines longer than your screen from being continued to
  1239.      the next line. This can make the result set much more readable.
  1240.      You can swith the mode between on and off within the interactive
  1241.      less with '-S'. See the 'h' for more help about less.
  1242.    * Last (unless you already understood this from the above examples
  1243.      ;) you can combine very complex ways to handle the results, for
  1244.      example the following would send the results to two files in two
  1245.      different directories, on two different hard-disks mounted on /dr1
  1246.      and /dr2, yet let the results still be seen on the screen via less:
  1247.           mysql> pager cat | tee /dr1/tmp/res.txt | tee /dr2/tmp/res2.txt | less -n -i -S
  1248.    * You can also combine the two functions above; have the `tee'
  1249.      enabled, `pager' set to 'less' and you will be able to browse the
  1250.      results in unix 'less' and still have everything appended into a
  1251.      file the same time. The difference between `UNIX tee' used with the
  1252.      `pager' and the `mysql' client in-built `tee', is that the
  1253.      in-built `tee' works even if you don't have the `UNIX tee'
  1254.      available. The in-built `tee' also logs everything that is printed
  1255.      on the screen, where the `UNIX tee' used with `pager' doesn't log
  1256.      quite that much. Last, but not least, the interactive `tee' is
  1257.      more handy to switch on and off, when you want to log something
  1258.      into a file, but want to be able to turn the feature off sometimes.
  1259. Administering a MySQL Server
  1260. ============================
  1261. A utility for performing administrative operations. The syntax is:
  1262.      shell> mysqladmin [OPTIONS] command [command-option] command ...
  1263. You can get a list of the options your version of `mysqladmin' supports
  1264. by executing `mysqladmin --help'.
  1265. The current `mysqladmin' supports the following commands:
  1266. create databasename    Create a new database.
  1267. drop databasename      Delete a database and all its tables.
  1268. extended-status        Gives an extended status message from the server.
  1269. flush-hosts            Flush all cached hosts.
  1270. flush-logs             Flush all logs.
  1271. flush-tables           Flush all tables.
  1272. flush-privileges       Reload grant tables (same as reload).
  1273. kill id,id,...         Kill mysql threads.
  1274. password               New-password. Change old password to new-password.
  1275. ping                   Check if mysqld is alive.
  1276. processlist            Show list of active threads in server.
  1277. reload                 Reload grant tables.
  1278. refresh                Flush all tables and close and open logfiles.
  1279. shutdown               Take server down.
  1280. slave-start            Start slave replication thread.
  1281. slave-stop             Stop slave replication thread.
  1282. status                 Gives a short status message from the server.
  1283. variables              Prints variables available.
  1284. version                Get version info from server.
  1285. All commands can be shortened to their unique prefix.  For example:
  1286.      shell> mysqladmin proc stat
  1287.      +----+-------+-----------+----+-------------+------+-------+------+
  1288.      | Id | User  | Host      | db | Command     | Time | State | Info |
  1289.      +----+-------+-----------+----+-------------+------+-------+------+
  1290.      | 6  | monty | localhost |    | Processlist | 0    |       |      |
  1291.      +----+-------+-----------+----+-------------+------+-------+------+
  1292.      Uptime: 10077  Threads: 1  Questions: 9  Slow queries: 0  Opens: 6  Flush tables: 1  Open tables: 2  Memory in use: 1092K  Max memory used: 1116K
  1293. The `mysqladmin status' command result has the following columns:
  1294. Uptime                 Number of seconds the *MySQL* server has been up.
  1295. Threads                Number of active threads (clients).
  1296. Questions              Number of questions from clients since `mysqld'
  1297.                        was started.
  1298. Slow queries           Queries that have taken more than
  1299.                        `long_query_time' seconds. *Note Slow query log::.
  1300. Opens                  How many tables `mysqld' has opened.
  1301. Flush tables           Number of `flush ...', `refresh', and `reload'
  1302.                        commands.
  1303. Open tables            Number of tables that are open now.
  1304. Memory in use          Memory allocated directly by the mysqld code
  1305.                        (only available when *MySQL* is compiled with
  1306.                        -with-debug).
  1307. Max memory used        Maximum memory allocated directly by the mysqld
  1308.                        code (only available when *MySQL* is compiled
  1309.                        with -with-debug).
  1310. If you do `myslqadmin shutdown' on a socket (in other words, on a the
  1311. computer where `mysqld' is running), `mysqladmin' will wait until the
  1312. *MySQL* `pid-file' is removed to ensure that the `mysqld' server has
  1313. stopped properly.
  1314. Dumping the Structure and Data from MySQL Databases and Tables
  1315. ==============================================================
  1316. Utility to dump a database or a collection of database for backup or for
  1317. transferring the data to another SQL server (not necessarily a MySQL
  1318. server).  The dump will contain SQL statements to create the table
  1319. and/or populate the table.
  1320. If you are doing a backup on the server, you should consider using the
  1321. `mysqlhotcopy' instead. *Note mysqlhotcopy::.
  1322.      shell> mysqldump [OPTIONS] database [tables]
  1323.      OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
  1324.      OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
  1325. If you don't give any tables or use the `--databases' or
  1326. `--all-databases', the whole database(s) will be dumped.
  1327. You can get a list of the options your version of `mysqldump' supports
  1328. by executing `mysqldump --help'.
  1329. Note that if you run `mysqldump' without `--quick' or `--opt',
  1330. `mysqldump' will load the whole result set into memory before dumping
  1331. the result.  This will probably be a problem if you are dumping a big
  1332. database.
  1333. Note that if you are using a new copy of the `mysqldump' program and
  1334. you are going to do a dump that will be read into a very old *MySQL*
  1335. server, you should not use the `--opt' or `-e' options.
  1336. `mysqldump' supports the following options:
  1337. `--add-locks'
  1338.      Add `LOCK TABLES' before and `UNLOCK TABLE' after each table dump.
  1339.      (To get faster inserts into *MySQL*.)
  1340. `--add-drop-table'
  1341.      Add a `drop table' before each create statement.
  1342. `-A, --all-databases'
  1343.      Dump all the databases. This will be same as `--databases' with all
  1344.      databases selected.
  1345. `-a, --all'
  1346.      Include all *MySQL*-specific create options.
  1347. `--allow-keywords'
  1348.      Allow creation of column names that are keywords.  This works by
  1349.      prefixing each column name with the table name.
  1350. `-c, --complete-insert'
  1351.      Use complete insert statements (with column names).
  1352. `-C, --compress'
  1353.      Compress all information between the client and the server if both
  1354.      support compression.
  1355. `-B, --databases'
  1356.      To dump several databases. Note the difference in usage. In this
  1357.      case no tables are given. All name arguments are regarded as
  1358.      databasenames.  `USE db_name;' will be included in the output
  1359.      before each new database.
  1360. `--delayed'
  1361.      Insert rows with the `INSERT DELAYED' command.
  1362. `-e, --extended-insert'
  1363.      Use the new multiline `INSERT' syntax. (Gives more compact and
  1364.      faster inserts statements.)
  1365. `-#, --debug[=option_string]'
  1366.      Trace usage of the program (for debugging).
  1367. `--help'
  1368.      Display a help message and exit.
  1369. `--fields-terminated-by=...'
  1370. `--fields-enclosed-by=...'
  1371. `--fields-optionally-enclosed-by=...'
  1372. `--fields-escaped-by=...'
  1373. `--lines-terminated-by=...'
  1374.      These options are used with the `-T' option and have the same
  1375.      meaning as the corresponding clauses for `LOAD DATA INFILE'.
  1376.      *Note `LOAD DATA': LOAD DATA.
  1377. `-F, --flush-logs'
  1378.      Flush log file in the *MySQL* server before starting the dump.
  1379. `-f, --force,'
  1380.      Continue even if we get a SQL error during a table dump.
  1381. `-h, --host=..'
  1382.      Dump data from the *MySQL* server on the named host. The default
  1383.      host is `localhost'.
  1384. `-l, --lock-tables.'
  1385.      Lock all tables before starting the dump.  The tables are locked
  1386.      with `READ LOCAL' to allow concurrent inserts in the case of
  1387.      `MyISAM' tables.
  1388. `-n, --no-create-db'
  1389.      'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;' will not be
  1390.      put in the output. The above line will be added otherwise, if
  1391.      -databases or -all-databases option was given.
  1392. `-t, --no-create-info'
  1393.      Don't write table creation information (The `CREATE TABLE'
  1394.      statement.)
  1395. `-d, --no-data'
  1396.      Don't write any row information for the table.  This is very
  1397.      useful if you just want to get a dump of the structure for a table!
  1398. `--opt'
  1399.      Same as `--quick --add-drop-table --add-locks --extended-insert
  1400.      --lock-tables'.  Should give you the fastest possible dump for
  1401.      reading into a *MySQL* server.
  1402. `-pyour_pass, --password[=your_pass]'
  1403.      The password to use when connecting to the server. If you specify
  1404.      no `=your_pass' part, `mysqldump' you will be prompted for a
  1405.      password.
  1406. `-P port_num, --port=port_num'
  1407.      The TCP/IP port number to use for connecting to a host.  (This is
  1408.      used for connections to hosts other than `localhost', for which
  1409.      Unix sockets are used.)
  1410. `-q, --quick'
  1411.      Don't buffer query, dump directly to stdout. Uses
  1412.      `mysql_use_result()' to do this.
  1413. `-S /path/to/socket, --socket=/path/to/socket'
  1414.      The socket file to use when connecting to `localhost' (which is the
  1415.      default host).
  1416. `--tables'
  1417.      Overrides option -databases (-B).
  1418. `-T, --tab=path-to-some-directory'
  1419.      Creates a `table_name.sql' file, that contains the SQL CREATE
  1420.      commands, and a `table_name.txt' file, that contains the data, for
  1421.      each give table.  *NOTE*: This only works if `mysqldump' is run on
  1422.      the same machine as the `mysqld' daemon.  The format of the `.txt'
  1423.      file is made according to the `--fields-xxx' and `--lines--xxx'
  1424.      options.
  1425. `-u user_name, --user=user_name'
  1426.      The *MySQL* user name to use when connecting to the server. The
  1427.      default value is your Unix login name.
  1428. `-O var=option, --set-variable var=option'
  1429.      Set the value of a variable.  The possible variables are listed
  1430.      below.
  1431. `-v, --verbose'
  1432.      Verbose mode.  Print out more information on what the program does.
  1433. `-V, --version'
  1434.      Print version information and exit.
  1435. `-w, --where='where-condition''
  1436.      Dump only selected records. Note that QUOTES are mandatory:
  1437.           "--where=user='jimf'" "-wuserid>1" "-wuserid<1"
  1438. `-O net_buffer_length=#, where # < 16M'
  1439.      When creating multi-row-insert statements (as with option
  1440.      `--extended-insert' or `--opt'), `mysqldump' will create rows up
  1441.      to `net_buffer_length' length. If you increase this variable, you
  1442.      should also ensure that the `max_allowed_packet' variable in the
  1443.      *MySQL* server is bigger than the `net_buffer_length'.
  1444. The most normal use of `mysqldump' is probably for making a backup of
  1445. whole databases. *Note Backup::.
  1446.      mysqldump --opt database > backup-file.sql
  1447. You can read this back into *MySQL* with:
  1448.      mysql database < backup-file.sql
  1449. or
  1450.      mysql -e "source /patch-to-backup/backup-file.sql" database
  1451. However, it's also very useful to populate another *MySQL* server with
  1452. information from a database:
  1453.      mysqldump --opt database | mysql ---host=remote-host -C database
  1454. It is possible to dump several databases with one command:
  1455.      mysqldump --databases database1 [database2 database3...] > my_databases.sql
  1456. If all the databases are wanted, one can use:
  1457.      mysqldump --all-databases > all_databases.sql
  1458. Copying MySQL Databases and Tables
  1459. ==================================
  1460. `mysqlhotcopy' is a perl script that uses `LOCK TABLES', `FLUSH TABLES'
  1461. and `cp' or `scp' to quickly make a backup of a database.  It's the
  1462. fastest way to make a backup of the database, but it can only be run on
  1463. the same machine where the database directories are.
  1464.      mysqlhotcopy db_name [/path/to/new_directory]
  1465.      
  1466.      mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory
  1467.      
  1468.      mysqlhotcopy db_name./regex/
  1469. `mysqlhotcopy' supports the following options:
  1470. `-?, --help'
  1471.      Display a helpscreen and exit
  1472. `-u, --user=#'
  1473.      User for database login
  1474. `-p, --password=#'
  1475.      Password to use when connecting to server
  1476. `-P, --port=#'
  1477.      Port to use when connecting to local server
  1478. `-S, --socket=#'
  1479.      Socket to use when connecting to local server
  1480. `--allowold'
  1481.      Don't abort if target already exists (rename it _old)
  1482. `--keepold'
  1483.      Don't delete previous (now renamed) target when done
  1484. `--noindices'
  1485.      Don't include full index files in copy to make the backup smaller
  1486.      and faster The indexes can later be reconstructed with `myisamchk
  1487.      -rq.'.
  1488. `--method=#'
  1489.      Method for copy (`cp' or `scp').
  1490. `-q, --quiet'
  1491.      Be silent except for errors
  1492. `--debug'
  1493.      Enable debug
  1494. `-n, --dryrun'
  1495.      Report actions without doing them
  1496. `--regexp=#'
  1497.      Copy all databases with names matching regexp
  1498. `--suffix=#'
  1499.      Suffix for names of copied databases
  1500. `--checkpoint=#'
  1501.      Insert checkpoint entry into specified db.table
  1502. `--flushlog'
  1503.      Flush logs once all tables are locked.
  1504. `--tmpdir=#'
  1505.      Temporary directory (instead of /tmp).
  1506. You can use 'perldoc mysqlhotcopy' to get a more complete documentation
  1507. for `mysqlhotcopy'.
  1508. `mysqlhotcopy' reads the group `[mysqlhotcopy]' from the option files.
  1509. Importing Data from Text Files
  1510. ==============================
  1511. `mysqlimport' provides a command-line interface to the `LOAD DATA
  1512. INFILE' SQL statement.  Most options to `mysqlimport' correspond
  1513. directly to the same options to `LOAD DATA INFILE'.  *Note `LOAD DATA':
  1514. LOAD DATA.
  1515. `mysqlimport' is invoked like this:
  1516.      shell> mysqlimport [options] database textfile1 [textfile2....]
  1517. For each text file named on the command line, `mysqlimport' strips any
  1518. extension from the filename and uses the result to determine which
  1519. table to import the file's contents into.  For example, files named
  1520. `patient.txt', `patient.text', and `patient' would all be imported into
  1521. a table named `patient'.
  1522. `mysqlimport' supports the following options:
  1523. `-c, --columns=...'
  1524.      This option takes a comma-separated list of field names as an
  1525.      argument.  The field list is passed to LOAD DATA INFILE MySQL sql
  1526.      command, which mysqlimport calls MySQL to execute. For more
  1527.      information, please see `LOAD DATA INFILE'. *Note `LOAD DATA':
  1528.      LOAD DATA.
  1529. `-C, --compress'
  1530.      Compress all information between the client and the server if both
  1531.      support compression.
  1532. `-#, --debug[=option_string]'
  1533.      Trace usage of the program (for debugging).
  1534. `-d, --delete'
  1535.      Empty the table before importing the text file.
  1536. `--fields-terminated-by=...'
  1537. `--fields-enclosed-by=...'
  1538. `--fields-optionally-enclosed-by=...'
  1539. `--fields-escaped-by=...'
  1540. `--lines-terminated-by=...'
  1541.      These options have the same meaning as the corresponding clauses
  1542.      for `LOAD DATA INFILE'. *Note `LOAD DATA': LOAD DATA.
  1543. `-f, --force'
  1544.      Ignore errors.  For example, if a table for a text file doesn't
  1545.      exist, continue processing any remaining files.  Without `--force',
  1546.      `mysqlimport' exits if a table doesn't exist.
  1547. `--help'
  1548.      Display a help message and exit.
  1549. `-h host_name, --host=host_name'
  1550.      Import data to the *MySQL* server on the named host. The default
  1551.      host is `localhost'.
  1552. `-i, --ignore'
  1553.      See the description for the `--replace' option.
  1554. `-l, --lock-tables'
  1555.      Lock *ALL* tables for writing before processing any text files.
  1556.      This ensures that all tables are synchronized on the server.
  1557. `-L, --local'
  1558.      Read input files from the client.  By default, text files are
  1559.      assumed to be on the server if you connect to `localhost' (which
  1560.      is the default host).
  1561. `-pyour_pass, --password[=your_pass]'
  1562.      The password to use when connecting to the server. If you specify
  1563.      no `=your_pass' part, `mysqlimport' you will be prompted for a
  1564.      password.
  1565. `-P port_num, --port=port_num'
  1566.      The TCP/IP port number to use for connecting to a host.  (This is
  1567.      used for connections to hosts other than `localhost', for which
  1568.      Unix sockets are used.)
  1569. `-r, --replace'
  1570.      The `--replace' and `--ignore' options control handling of input
  1571.      records that duplicate existing records on unique key values.  If
  1572.      you specify `--replace', new rows replace existing rows that have
  1573.      the same unique key value. If you specify `--ignore', input rows
  1574.      that duplicate an existing row on a unique key value are skipped.
  1575.      If you don't specify either option, an error occurs when a
  1576.      duplicate key value is found, and the rest of the text file is
  1577.      ignored.
  1578. `-s, --silent'
  1579.      Silent mode.  Write output only when errors occur.
  1580. `-S /path/to/socket, --socket=/path/to/socket'
  1581.      The socket file to use when connecting to `localhost' (which is the
  1582.      default host).
  1583. `-u user_name, --user=user_name'
  1584.      The *MySQL* user name to use when connecting to the server. The
  1585.      default value is your Unix login name.
  1586. `-v, --verbose'
  1587.      Verbose mode.  Print out more information what the program does.
  1588. `-V, --version'
  1589.      Print version information and exit.
  1590. Here is a sample run using `mysqlimport':
  1591.      $ mysql --version
  1592.      mysql  Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
  1593.      $ uname -a
  1594.      Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
  1595.      $ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
  1596.      $ ed
  1597.      a
  1598.      100     Max Sydow
  1599.      101     Count Dracula
  1600.      .
  1601.      w imptest.txt
  1602.      32
  1603.      q
  1604.      $ od -c imptest.txt
  1605.      0000000   1   0   0  t   M   a   x       S   y   d   o   w  n   1   0
  1606.      0000020   1  t   C   o   u   n   t       D   r   a   c   u   l   a  n
  1607.      0000040
  1608.      $ mysqlimport --local test imptest.txt
  1609.      test.imptest: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0
  1610.      $ mysql -e 'SELECT * FROM imptest' test
  1611.      +------+---------------+
  1612.      | id   | n             |
  1613.      +------+---------------+
  1614.      |  100 | Max Sydow     |
  1615.      |  101 | Count Dracula |
  1616.      +------+---------------+
  1617. Converting an error code to the corresponding error message
  1618. ===========================================================
  1619. `perror' can be used to print error message(s). `perror' can be invoked
  1620. like this:
  1621.      shell> perror [OPTIONS] [ERRORCODE [ERRORCODE...]]
  1622.      
  1623.      For example:
  1624.      
  1625.      shell> perror 64 79
  1626.      Error code  64:  Machine is not on the network
  1627.      Error code  79:  Can not access a needed shared library
  1628. `perror' can be used to display a description for a system error code,
  1629. or an MyISAM/ISAM table handler error code. The error messages are
  1630. mostly system dependent.
  1631. Showing Databases, Tables, and Columns
  1632. ======================================
  1633. `mysqlshow' can be used to quickly look at which databases exist, their
  1634. tables, and the table's columns.
  1635. With the `mysql' program you can get the same information with the
  1636. `SHOW' commands.  *Note SHOW::.
  1637. `mysqlshow' is invoked like this:
  1638.      shell> mysqlshow [OPTIONS] [database [table [column]]]
  1639.    * If no database is given, all matching databases are shown.
  1640.    * If no table is given, all matching tables in the database are
  1641.      shown.
  1642.    * If no column is given, all matching columns and column types in
  1643.      the table are shown.
  1644. Note that in newer *MySQL* versions, you only see those
  1645. database/tables/columns for which you have some privileges.
  1646. If the last argument contains a shell or SQL wild-card (`*', `?', `%'
  1647. or `_') then only what's matched by the wild card is shown.  This may
  1648. cause some confusion when you try to display the columns for a table
  1649. with a `_' as in this case `mysqlshow' only shows you the table names
  1650. that match the pattern.  This is easily fixed by adding an extra `%'
  1651. last on the command line (as a separate argument).
  1652. The MySQL Compressed Read-only Table Generator
  1653. ==============================================
  1654. `myisampack' is used to compress MyISAM tables, and `pack_isam' is used
  1655. to compress ISAM tables. Because ISAM tables are deprecated, we will
  1656. only discuss `myisampack' here, but everything said about `myisampack'
  1657. should also be true for `pack_isam'.
  1658. `myisampack' works by compressing each column in the table separately.
  1659. The information needed to decompress columns is read into memory when
  1660. the table is opened. This results in much better performance when
  1661. accessing individual records, because you only have to uncompress
  1662. exactly one record, not a much larger disk block as when using Stacker
  1663. on MS-DOS.  Usually, `myisampack' packs the data file 40%-70%.
  1664. *MySQL* uses memory mapping (`mmap()') on compressed tables and falls
  1665. back to normal read/write file usage if `mmap()' doesn't work.
  1666. There are currently two limitations with `myisampack':
  1667.    * After packing, the table is read-only.
  1668.    * `myisampack' can also pack `BLOB' or `TEXT' columns. The older
  1669.      `pack_isam' could not do this.
  1670. Fixing these limitations is on our TODO list but with low priority.
  1671. `myisampack' is invoked like this:
  1672.      shell> myisampack [options] filename ...
  1673. Each filename should be the name of an index (`.MYI') file.  If you are
  1674. not in the database directory, you should specify the pathname to the
  1675. file.  It is permissible to omit the `.MYI' extension.
  1676. `myisampack' supports the following options:
  1677. `-b, --backup'
  1678.      Make a backup of the table as `tbl_name.OLD'.
  1679. `-#, --debug=debug_options'
  1680.      Output debug log. The `debug_options' string often is
  1681.      `'d:t:o,filename''.
  1682. `-f, --force'
  1683.      Force packing of the table even if it becomes bigger or if the
  1684.      temporary file exists.  `myisampack' creates a temporary file
  1685.      named `tbl_name.TMD' while it compresses the table.  If you kill
  1686.      `myisampack', the `.TMD' file may not be deleted.  Normally,
  1687.      `myisampack' exits with an error if it finds that `tbl_name.TMD'
  1688.      exists.  With `--force', `myisampack' packs the table anyway.
  1689. `-?, --help'
  1690.      Display a help message and exit.
  1691. `-j big_tbl_name, --join=big_tbl_name'
  1692.      Join all tables named on the command line into a single table
  1693.      `big_tbl_name'.  All tables that are to be combined MUST be
  1694.      identical (same column names and types, same indexes, etc.).
  1695. `-p #, --packlength=#'
  1696.      Specify the record length storage size, in bytes.  The value
  1697.      should be 1, 2, or 3.  (`myisampack' stores all rows with length
  1698.      pointers of 1, 2, or 3 bytes.  In most normal cases, `myisampack'
  1699.      can determine the right length value before it begins packing the
  1700.      file, but it may notice during the packing process that it could
  1701.      have used a shorter length. In this case, `myisampack' will print
  1702.      a note that the next time you pack the same file, you could use a
  1703.      shorter record length.)
  1704. `-s, --silent'
  1705.      Silent mode.  Write output only when errors occur.
  1706. `-t, --test'
  1707.      Don't actually pack table, just test packing it.
  1708. `-T dir_name, --tmp_dir=dir_name'
  1709.      Use the named directory as the location in which to write the
  1710.      temporary table.
  1711. `-v, --verbose'
  1712.      Verbose mode.  Write information about progress and packing result.
  1713. `-V, --version'
  1714.      Display version information and exit.
  1715. `-w, --wait'
  1716.      Wait and retry if table is in use.  If the `mysqld' server was
  1717.      invoked with the `--skip-locking' option, it is not a good idea to
  1718.      invoke `myisampack' if the table might be updated during the
  1719.      packing process.
  1720. The sequence of commands shown below illustrates a typical table
  1721. compression session:
  1722.      shell> ls -l station.*
  1723.      -rw-rw-r--   1 monty    my         994128 Apr 17 19:00 station.MYD
  1724.      -rw-rw-r--   1 monty    my          53248 Apr 17 19:00 station.MYI
  1725.      -rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm
  1726.      
  1727.      shell> myisamchk -dvv station
  1728.      
  1729.      MyISAM file:     station
  1730.      Isam-version:  2
  1731.      Creation time: 1996-03-13 10:08:58
  1732.      Recover time:  1997-02-02  3:06:43
  1733.      Data records:              1192  Deleted blocks:              0
  1734.      Datafile: Parts:           1192  Deleted data:                0
  1735.      Datafile pointer (bytes):     2  Keyfile pointer (bytes):     2
  1736.      Max datafile length:   54657023  Max keyfile length:   33554431
  1737.      Recordlength:               834
  1738.      Record format: Fixed length
  1739.      
  1740.      table description:
  1741.      Key Start Len Index   Type                       Root  Blocksize    Rec/key
  1742.      1   2     4   unique  unsigned long              1024       1024          1
  1743.      2   32    30  multip. text                      10240       1024          1
  1744.      
  1745.      Field Start Length Type
  1746.      1     1     1
  1747.      2     2     4
  1748.      3     6     4
  1749.      4     10    1
  1750.      5     11    20
  1751.      6     31    1
  1752.      7     32    30
  1753.      8     62    35
  1754.      9     97    35
  1755.      10    132   35
  1756.      11    167   4
  1757.      12    171   16
  1758.      13    187   35
  1759.      14    222   4
  1760.      15    226   16
  1761.      16    242   20
  1762.      17    262   20
  1763.      18    282   20
  1764.      19    302   30
  1765.      20    332   4
  1766.      21    336   4
  1767.      22    340   1
  1768.      23    341   8
  1769.      24    349   8
  1770.      25    357   8
  1771.      26    365   2
  1772.      27    367   2
  1773.      28    369   4
  1774.      29    373   4
  1775.      30    377   1
  1776.      31    378   2
  1777.      32    380   8
  1778.      33    388   4
  1779.      34    392   4
  1780.      35    396   4
  1781.      36    400   4
  1782.      37    404   1
  1783.      38    405   4
  1784.      39    409   4
  1785.      40    413   4
  1786.      41    417   4
  1787.      42    421   4
  1788.      43    425   4
  1789.      44    429   20
  1790.      45    449   30
  1791.      46    479   1
  1792.      47    480   1
  1793.      48    481   79
  1794.      49    560   79
  1795.      50    639   79
  1796.      51    718   79
  1797.      52    797   8
  1798.      53    805   1
  1799.      54    806   1
  1800.      55    807   20
  1801.      56    827   4
  1802.      57    831   4
  1803.      
  1804.      shell> myisampack station.MYI
  1805.      Compressing station.MYI: (1192 records)
  1806.      - Calculating statistics
  1807.      
  1808.      normal:     20  empty-space:      16  empty-zero:        12  empty-fill:  11
  1809.      pre-space:   0  end-space:        12  table-lookups:      5  zero:         7
  1810.      Original trees:  57  After join: 17
  1811.      - Compressing file
  1812.      87.14%
  1813.      
  1814.      shell> ls -l station.*
  1815.      -rw-rw-r--   1 monty    my         127874 Apr 17 19:00 station.MYD
  1816.      -rw-rw-r--   1 monty    my          55296 Apr 17 19:04 station.MYI
  1817.      -rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm
  1818.      
  1819.      shell> myisamchk -dvv station
  1820.      
  1821.      MyISAM file:     station
  1822.      Isam-version:  2
  1823.      Creation time: 1996-03-13 10:08:58
  1824.      Recover time:  1997-04-17 19:04:26
  1825.      Data records:              1192  Deleted blocks:              0
  1826.      Datafile: Parts:           1192  Deleted data:                0
  1827.      Datafilepointer (bytes):      3  Keyfile pointer (bytes):     1
  1828.      Max datafile length:   16777215  Max keyfile length:     131071
  1829.      Recordlength:               834
  1830.      Record format: Compressed
  1831.      
  1832.      table description:
  1833.      Key Start Len Index   Type                       Root  Blocksize    Rec/key
  1834.      1   2     4   unique  unsigned long             10240       1024          1
  1835.      2   32    30  multip. text                      54272       1024          1
  1836.      
  1837.      Field Start Length Type                         Huff tree  Bits
  1838.      1     1     1      constant                             1     0
  1839.      2     2     4      zerofill(1)                          2     9
  1840.      3     6     4      no zeros, zerofill(1)                2     9
  1841.      4     10    1                                           3     9
  1842.      5     11    20     table-lookup                         4     0
  1843.      6     31    1                                           3     9
  1844.      7     32    30     no endspace, not_always              5     9
  1845.      8     62    35     no endspace, not_always, no empty    6     9
  1846.      9     97    35     no empty                             7     9
  1847.      10    132   35     no endspace, not_always, no empty    6     9
  1848.      11    167   4      zerofill(1)                          2     9
  1849.      12    171   16     no endspace, not_always, no empty    5     9
  1850.      13    187   35     no endspace, not_always, no empty    6     9
  1851.      14    222   4      zerofill(1)                          2     9
  1852.      15    226   16     no endspace, not_always, no empty    5     9
  1853.      16    242   20     no endspace, not_always              8     9
  1854.      17    262   20     no endspace, no empty                8     9
  1855.      18    282   20     no endspace, no empty                5     9
  1856.      19    302   30     no endspace, no empty                6     9
  1857.      20    332   4      always zero                          2     9
  1858.      21    336   4      always zero                          2     9
  1859.      22    340   1                                           3     9
  1860.      23    341   8      table-lookup                         9     0
  1861.      24    349   8      table-lookup                        10     0
  1862.      25    357   8      always zero                          2     9
  1863.      26    365   2                                           2     9
  1864.      27    367   2      no zeros, zerofill(1)                2     9
  1865.      28    369   4      no zeros, zerofill(1)                2     9
  1866.      29    373   4      table-lookup                        11     0
  1867.      30    377   1                                           3     9
  1868.      31    378   2      no zeros, zerofill(1)                2     9
  1869.      32    380   8      no zeros                             2     9
  1870.      33    388   4      always zero                          2     9
  1871.      34    392   4      table-lookup                        12     0
  1872.      35    396   4      no zeros, zerofill(1)               13     9
  1873.      36    400   4      no zeros, zerofill(1)                2     9
  1874.      37    404   1                                           2     9
  1875.      38    405   4      no zeros                             2     9
  1876.      39    409   4      always zero                          2     9
  1877.      40    413   4      no zeros                             2     9
  1878.      41    417   4      always zero                          2     9
  1879.      42    421   4      no zeros                             2     9
  1880.      43    425   4      always zero                          2     9
  1881.      44    429   20     no empty                             3     9
  1882.      45    449   30     no empty                             3     9
  1883.      46    479   1                                          14     4
  1884.      47    480   1                                          14     4
  1885.      48    481   79     no endspace, no empty               15     9
  1886.      49    560   79     no empty                             2     9
  1887.      50    639   79     no empty                             2     9
  1888.      51    718   79     no endspace                         16     9
  1889.      52    797   8      no empty                             2     9
  1890.      53    805   1                                          17     1
  1891.      54    806   1                                           3     9
  1892.      55    807   20     no empty                             3     9
  1893.      56    827   4      no zeros, zerofill(2)                2     9
  1894.      57    831   4      no zeros, zerofill(1)                2     9
  1895. The information printed by `myisampack' is described below:
  1896. `normal'
  1897.      The number of columns for which no extra packing is used.
  1898. `empty-space'
  1899.      The number of columns containing values that are only spaces;
  1900.      these will occupy 1 bit.
  1901. `empty-zero'
  1902.      The number of columns containing values that are only binary 0's;
  1903.      these will occupy 1 bit.
  1904. `empty-fill'
  1905.      The number of integer columns that don't occupy the full byte
  1906.      range of their type; these are changed to a smaller type (for
  1907.      example, an `INTEGER' column may be changed to `MEDIUMINT').
  1908. `pre-space'
  1909.      The number of decimal columns that are stored with leading spaces.
  1910.      In this case, each value will contain a count for the number of
  1911.      leading spaces.
  1912. `end-space'
  1913.      The number of columns that have a lot of trailing spaces.  In this
  1914.      case, each value will contain a count for the number of trailing
  1915.      spaces.
  1916. `table-lookup'
  1917.      The column had only a small number of different values, which were
  1918.      converted to an `ENUM' before Huffman compression.
  1919. `zero'
  1920.      The number of columns for which all values are zero.
  1921. `Original trees'
  1922.      The initial number of Huffman trees.
  1923. `After join'
  1924.      The number of distinct Huffman trees left after joining trees to
  1925.      save some header space.
  1926. After a table has been compressed, `myisamchk -dvv' prints additional
  1927. information about each field:
  1928. `Type'
  1929.      The field type may contain the following descriptors:
  1930.     `constant'
  1931.           All rows have the same value.
  1932.     `no endspace'
  1933.           Don't store endspace.
  1934.     `no endspace, not_always'
  1935.           Don't store endspace and don't do end space compression for
  1936.           all values.
  1937.     `no endspace, no empty'
  1938.           Don't store endspace. Don't store empty values.
  1939.     `table-lookup'
  1940.           The column was converted to an `ENUM'.
  1941.     `zerofill(n)'
  1942.           The most significant `n' bytes in the value are always 0 and
  1943.           are not stored.
  1944.     `no zeros'
  1945.           Don't store zeros.
  1946.     `always zero'
  1947.           0 values are stored in 1 bit.
  1948. `Huff tree'
  1949.      The Huffman tree associated with the field.
  1950. `Bits'
  1951.      The number of bits used in the Huffman tree.
  1952. After you have run `pack_isam'/`myisampack' you must run
  1953. `isamchk'/`myisamchk' to re-create the index.  At this time you can
  1954. also sort the index blocks and create statistics needed for the *MySQL*
  1955. optimizer to work more efficiently:
  1956.      myisamchk -rq --analyze --sort-index table_name.MYI
  1957.      isamchk   -rq --analyze --sort-index table_name.ISM
  1958. After you have installed the packed table into the *MySQL* database
  1959. directory you should do `mysqladmin flush-tables' to force `mysqld' to
  1960. start using the new table.
  1961. Maintaining a MySQL Installation
  1962. ********************************
  1963. Using `myisamchk' for Table Maintenance and Crash Recovery
  1964. ==========================================================
  1965. Starting with *MySQL* Version 3.23.13, you can check MyISAM tables with
  1966. the `CHECK TABLE' command. *Note CHECK TABLE::.  You can repair tables
  1967. with the `REPAIR TABLE' command. *Note REPAIR TABLE::.
  1968. To check/repair MyISAM tables (`.MYI' and `.MYD') you should use the
  1969. `myisamchk' utility. To check/repair ISAM tables (`.ISM' and `.ISD')
  1970. you should use the `isamchk' utility. *Note Table types::.
  1971. In the following text we will talk about `myisamchk', but everything
  1972. also applies to the old `isamchk'.
  1973. You can use the `myisamchk' utility to get information about your
  1974. database tables, check and repair them, or optimize them.  The following
  1975. sections describe how to invoke `myisamchk' (including a description of
  1976. its options), how to set up a table maintenance schedule, and how to
  1977. use `myisamchk' to perform its various functions.
  1978. You can, in most cases, also use the command `OPTIMIZE TABLES' to
  1979. optimize and repair tables, but this is not as fast or reliable (in case
  1980. of real fatal errors) as `myisamchk'.  On the other hand, `OPTIMIZE
  1981. TABLE' is easier to use and you don't have to worry about flushing
  1982. tables.  *Note `OPTIMIZE TABLE': OPTIMIZE TABLE.
  1983. Even that the repair in `myisamchk' is quite secure, it's always a good
  1984. idea to make a backup BEFORE doing a repair (or anything that could
  1985. make a lot of changes to a table)
  1986. `myisamchk' Invocation Syntax
  1987. -----------------------------
  1988. `myisamchk' is invoked like this:
  1989.      shell> myisamchk [options] tbl_name
  1990. The `options' specify what you want `myisamchk' to do.  They are
  1991. described below.  (You can also get a list of options by invoking
  1992. `myisamchk --help'.)  With no options, `myisamchk' simply checks your
  1993. table.  To get more information or to tell `myisamchk' to take
  1994. corrective action, specify options as described below and in the
  1995. following sections.
  1996. `tbl_name' is the database table you want to check/repair.  If you run
  1997. `myisamchk' somewhere other than in the database directory, you must
  1998. specify the path to the file, because `myisamchk' has no idea where your
  1999. database is located.  Actually, `myisamchk' doesn't care whether or not
  2000. the files you are working on are located in a database directory; you
  2001. can copy the files that correspond to a database table into another
  2002. location and perform recovery operations on them there.
  2003. You can name several tables on the `myisamchk' command line if you
  2004. wish.  You can also specify a name as an index file name (with the
  2005. `.MYI' suffix), which allows you to specify all tables in a directory
  2006. by using the pattern `*.MYI'.  For example, if you are in a database
  2007. directory, you can check all the tables in the directory like this:
  2008.      shell> myisamchk *.MYI
  2009. If you are not in the database directory, you can check all the tables
  2010. there by specifying the path to the directory:
  2011.      shell> myisamchk /path/to/database_dir/*.MYI
  2012. You can even check all tables in all databases by specifying a wild card
  2013. with the path to the *MySQL* data directory:
  2014.      shell> myisamchk /path/to/datadir/*/*.MYI
  2015. The recommended way to quickly check all tables is:
  2016.      myisamchk --silent --fast /path/to/datadir/*/*.MYI
  2017.      isamchk --silent /path/to/datadir/*/*.ISM
  2018. If you want to check all tables and repair all tables that are
  2019. corrupted, you can use the following line:
  2020.      myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.MYI
  2021.      isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.ISM
  2022. The above assumes that you have more than 64 M free.
  2023. Note that if you get an error like:
  2024.      myisamchk: warning: 1 clients is using or hasn't closed the table properly
  2025. This means that you are trying to check a table that has been updated by
  2026. the another program (like the mysqld server) that hasn't yet closed the
  2027. file or that has died without closing the file properly.
  2028. If you `mysqld' is running, you must force a sync/close of all tables
  2029. with `FLUSH TABLES' and ensure that no one is using the tables while
  2030. you are running `myisamchk'.  In *MySQL* Version 3.23 the easiest way
  2031. to avoid this problem is to use `CHECK TABLE' instead of `myisamchk' to
  2032. check tables.
  2033. General Options for `myisamchk'
  2034. ...............................
  2035. `myisamchk' supports the following options.
  2036. `-# or --debug=debug_options'
  2037.      Output debug log. The `debug_options' string often is
  2038.      `'d:t:o,filename''.
  2039. `-? or --help'
  2040.      Display a help message and exit.
  2041. `-O var=option, --set-variable var=option'
  2042.      Set the value of a variable.  The possible variables and their
  2043.      default values for myisamchk can be examined with `myisamchk
  2044.      --help':
  2045.      key_buffer_size      523264
  2046.      read_buffer_size     262136
  2047.      write_buffer_size    262136
  2048.      sort_buffer_size     2097144
  2049.      sort_key_blocks      16
  2050.      decode_bits          9
  2051.      `sort_buffer_size' is used when the keys are reparied by sorting
  2052.      keys, which is the normal case when you use `--recover'.
  2053.      `key_buffer_size' is used when you are checking the table with
  2054.      `--extended-check' or when the keys are repaired by inserting key
  2055.      row by row in to the table (like when doing normal inserts).
  2056.      Repairing through the key buffer is used in the following cases:
  2057.         * If you use `--safe-recover'.
  2058.         * If you are using a `FULLTEXT' index.
  2059.         * If the temporary files needed to sort the keys would be more
  2060.           than twice as big as when creating the key file directly.
  2061.           This is often the case when you have big `CHAR', `VARCHAR' or
  2062.           `TEXT' keys as the sort needs to store the whole keys during
  2063.           sorting. If you have lots of temporary space and you can
  2064.           force `myisamchk' to repair by sorting you can use the
  2065.           `--sort-recover' option.
  2066.      Reparing through the key buffer takes much less disk space than
  2067.      using sorting, but is also much slower.
  2068.      If you want a faster repair, set the above variables to about 1/4
  2069.      of your available memory.  You can set both variables to big
  2070.      values, as only one of the above buffers will be used at a time.
  2071. `-s or --silent'
  2072.      Silent mode.  Write output only when errors occur. You can use `-s'
  2073.      twice (`-ss') to make `myisamchk' very silent.
  2074. `-v or --verbose'
  2075.      Verbose mode.  Print more information. This can be used with `-d'
  2076.      and `-e'. Use `-v' multiple times (`-vv', `-vvv') for more
  2077.      verbosity!
  2078. `-V or --version'
  2079.      Print the `myisamchk' version and exit.
  2080. `-w or, --wait'
  2081.      Instead of giving an error if the table is locked, wait until the
  2082.      table is unlocked before continuing.  Note that if you are running
  2083.      `mysqld' on the table with `--skip-locking', the table can only be
  2084.      locked by another `myisamchk' command.
  2085. Check Options for `myisamchk'
  2086. .............................
  2087. `-c or --check'
  2088.      Check table for errors. This is the default operation if you are
  2089.      not giving `myisamchk' any options that override this.
  2090. `-e or --extend-check'
  2091.      Check the table VERY thoroughly (which is quite slow if you have
  2092.      many indexes).  This option should only be used in extreme cases.
  2093.      Normally, `myisamchk' or `myisamchk --medium-check' should, in most
  2094.      cases, be able to find out if there are any errors in the table.
  2095.      If you are using `--extended-check' and have much memory, you
  2096.      should increase the value of `key_buffer_size' a lot!
  2097. `-F or --fast'
  2098.      Check only tables that haven't been closed properly.
  2099. `-C or --check-only-changed'
  2100.      Check only tables that have changed since the last check.
  2101. `-f or --force'
  2102.      Restart `myisamchk' with `-r' (repair) on the table, if
  2103.      `myisamchk' finds any errors in the table.
  2104. `-i or --information'
  2105.      Print informational statistics about the table that is checked.
  2106. `-m or --medium-check'
  2107.      Faster than extended-check, but only finds 99.99% of all errors.
  2108.      Should, however, be good enough for most cases.
  2109. `-U or --update-state'
  2110.      Store in the `.MYI' file when the table was checked and if the
  2111.      table crashed.  This should be used to get full benefit of the
  2112.      `--check-only-changed' option, but you shouldn't use this option
  2113.      if the `mysqld' server is using the table and you are running
  2114.      `mysqld' with `--skip-locking'.
  2115. `-T or --read-only'
  2116.      Don't mark table as checked. This is useful if you use `myisamchk'
  2117.      to check a table that is in use by some other application that
  2118.      doesn't use locking (like `mysqld --skip-locking').
  2119. Repair Options for myisamchk
  2120. ............................
  2121. The following options are used if you start `myisamchk' with `-r' or
  2122. `-o':
  2123. `-D # or --data-file-length=#'
  2124.      Max length of data file (when re-creating data file when it's
  2125.      'full').
  2126. `-e or --extend-check'
  2127.      Try to recover every possible row from the data file.  Normally
  2128.      this will also find a lot of garbage rows. Don't use this option
  2129.      if you are not totally desperate.
  2130. `-f or --force'
  2131.      Overwrite old temporary files (`table_name.TMD') instead of
  2132.      aborting.
  2133. `-k # or keys-used=#'
  2134.      If you are using ISAM, tells the ISAM table handler to update only
  2135.      the first `#' indexes.  If you are using `MyISAM', tells which keys
  2136.      to use, where each binary bit stands for one key (first key is bit
  2137.      0).  This can be used to get faster inserts!  Deactivated indexes
  2138.      can be reactivated by using `myisamchk -r'.  keys.
  2139. `-l or --no-symlinks'
  2140.      Do not follow symbolic links. Normally `myisamchk' repairs the
  2141.      table a symlink points at.
  2142. `-r or --recover'
  2143.      Can fix almost anything except unique keys that aren't unique
  2144.      (which is an extremely unlikely error with ISAM/MyISAM tables).
  2145.      If you want to recover a table, this is the option to try first.
  2146.      Only if myisamchk reports that the table can't be recovered by
  2147.      `-r', you should then try `-o'.  (Note that in the unlikely case
  2148.      that `-r' fails, the data file is still intact.)  If you have lots
  2149.      of memory, you should increase the size of `sort_buffer_size'!
  2150. `-o or --safe-recover'
  2151.      Uses an old recovery method (reads through all rows in order and
  2152.      updates all index trees based on the found rows); this is a
  2153.      magnitude slower than `-r', but can handle a couple of very
  2154.      unlikely cases that `-r' cannot handle.  This recovery method also
  2155.      uses much less disk space than `-r'. Normally one should always
  2156.      first repair with `-r', and only if this fails use `-o'.
  2157.      If you have lots of memory, you should increase the size of
  2158.      `key_buffer_size'!
  2159. `-n or --sort-recover'
  2160.      Force `myisamchk' to use sorting to resolve the keys even if the
  2161.      temporary files should be very big.  This will not have any effect
  2162.      if you have fulltext keys in the table.
  2163. `--character-sets-dir=...'
  2164.      Directory where character sets are stored.
  2165. `--set-character-set=name'
  2166.      Change the character set used by the index
  2167. `.t or --tmpdir=path'
  2168.      Path for storing temporary files. If this is not set, `myisamchk'
  2169.      will use the environment variable `TMPDIR' for this.
  2170. `-q or --quick'
  2171.      Faster repair by not modifying the data file. One can give a second
  2172.      `-q' to force `myisamchk' to modify the original datafile in case
  2173.      of duplicate keys
  2174. `-u or --unpack'
  2175.      Unpack file packed with myisampack.
  2176. Other Options for `myisamchk'
  2177. .............................
  2178. Other actions that `myisamchk' can do, besides repair and check tables:
  2179. `-a or --analyze'
  2180.      Analyze the distribution of keys. This improves join performance by
  2181.      enabling the join optimizer to better choose in which order it
  2182.      should join the tables and which keys it should use: `myisamchk
  2183.      --describe --verbose table_name'' or using `SHOW KEYS' in *MySQL*.
  2184. `-d or --description'
  2185.      Prints some information about table.
  2186. `-A or --set-auto-increment[=value]'
  2187.      Force auto_increment to start at this or higher value. If no value
  2188.      is given, then sets the next auto_increment value to the highest
  2189.      used value for the auto key + 1.
  2190. `-S or --sort-index'
  2191.      Sort the index tree blocks in high-low order.  This will optimize
  2192.      seeks and will make table scanning by key faster.
  2193. `-R or --sort-records=#'
  2194.      Sorts records according to an index.  This makes your data much
  2195.      more localized and may speed up ranged `SELECT' and `ORDER BY'
  2196.      operations on this index. (It may be VERY slow to do a sort the
  2197.      first time!)  To find out a table's index numbers, use `SHOW
  2198.      INDEX', which shows a table's indexes in the same order that
  2199.      `myisamchk' sees them.  Indexes are numbered beginning with 1.
  2200. `myisamchk' Memory Usage
  2201. ------------------------
  2202. Memory allocation is important when you run `myisamchk'.  `myisamchk'
  2203. uses no more memory than you specify with the `-O' options.  If you are
  2204. going to use `myisamchk' on very large files, you should first decide
  2205. how much memory you want it to use.  The default is to use only about
  2206. 3M to fix things.  By using larger values, you can get `myisamchk' to
  2207. operate faster.  For example, if you have more than 32M RAM, you could
  2208. use options such as these (in addition to any other options you might
  2209. specify):
  2210.      shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
  2211. Using `-O sort=16M' should probably be enough for most cases.
  2212. Be aware that `myisamchk' uses temporary files in `TMPDIR'. If `TMPDIR'
  2213. points to a memory file system, you may easily get out of memory
  2214. errors. If this happens, set `TMPDIR' to point at some directory with
  2215. more space and restart `myisamchk'.
  2216. When repairing, `myisamchk' will also nead a lot of disk space:
  2217.    * Double the size of the record file (the original one and a copy).