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

MySQL数据库

开发平台:

Visual C++

  1. @item
  2. A character class @samp{[...]} matches any character within the brackets.
  3. For example, @samp{[abc]} matches @samp{a}, @samp{b}, or @samp{c}.  To name a
  4. range of characters, use a dash.  @samp{[a-z]} matches any lowercase letter,
  5. whereas @samp{[0-9]} matches any digit.
  6. @item
  7. @samp{*} matches zero or more instances of the thing preceding it.  For
  8. example, @samp{x*} matches any number of @samp{x} characters,
  9. @samp{[0-9]*} matches any number of digits, and @samp{.*} matches any
  10. number of anything.
  11. @item
  12. Regular expressions are case sensitive, but you can use a character class to
  13. match both lettercases if you wish.  For example, @samp{[aA]} matches
  14. lowercase or uppercase @samp{a} and @samp{[a-zA-Z]} matches any letter in
  15. either case.
  16. @item
  17. The pattern matches if it occurs anywhere in the value being tested.
  18. (SQL patterns match only if they match the entire value.)
  19. @item
  20. To anchor a pattern so that it must match the beginning or end of the value
  21. being tested, use @samp{^} at the beginning or @samp{$} at the end of the
  22. pattern.
  23. @end itemize
  24. To demonstrate how extended regular expressions work, the @code{LIKE} queries
  25. shown above are rewritten below to use @code{REGEXP}.
  26. To find names beginning with @samp{b}, use @samp{^} to match the beginning of
  27. the name:
  28. @example
  29. mysql> SELECT * FROM pet WHERE name REGEXP "^b";
  30. +--------+--------+---------+------+------------+------------+
  31. | name   | owner  | species | sex  | birth      | death      |
  32. +--------+--------+---------+------+------------+------------+
  33. | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
  34. | Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
  35. +--------+--------+---------+------+------------+------------+
  36. @end example
  37. Prior to MySQL 3.23.4, @code{REGEXP} is case sensitive, and the previous
  38. query will return no rows. To match either lowercase or uppercase @samp{b},
  39. use this query instead:
  40. @example
  41. mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
  42. @end example
  43. From MySQL 3.23.4 on, to force a @code{REGEXP} comparison to be case
  44. sensitive, use the @code{BINARY} keyword to make one of the strings a
  45. binary string. This query will match only lowercase @samp{b} at the
  46. beginning of a name:
  47. @example
  48. mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
  49. @end example
  50. To find names ending with @samp{fy}, use @samp{$} to match the end of the
  51. name:
  52. @example
  53. mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
  54. +--------+--------+---------+------+------------+-------+
  55. | name   | owner  | species | sex  | birth      | death |
  56. +--------+--------+---------+------+------------+-------+
  57. | Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
  58. | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
  59. +--------+--------+---------+------+------------+-------+
  60. @end example
  61. To find names containing a lowercase or uppercase @samp{w}, use this query:
  62. @example
  63. mysql> SELECT * FROM pet WHERE name REGEXP "w";
  64. +----------+-------+---------+------+------------+------------+
  65. | name     | owner | species | sex  | birth      | death      |
  66. +----------+-------+---------+------+------------+------------+
  67. | Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
  68. | Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
  69. | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
  70. +----------+-------+---------+------+------------+------------+
  71. @end example
  72. Because a regular expression pattern matches if it occurs anywhere in the
  73. value, it is not necessary in the previous query to put a wild card on either
  74. side of the pattern to get it to match the entire value like it would be if
  75. you used a SQL pattern.
  76. To find names containing exactly five characters, use @samp{^} and @samp{$}
  77. to match the beginning and end of the name, and five instances of @samp{.}
  78. in between:
  79. @example
  80. mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
  81. +-------+--------+---------+------+------------+-------+
  82. | name  | owner  | species | sex  | birth      | death |
  83. +-------+--------+---------+------+------------+-------+
  84. | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  85. | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  86. +-------+--------+---------+------+------------+-------+
  87. @end example
  88. You could also write the previous query using the @samp{@{n@}}
  89. ``repeat-@code{n}-times'' operator:
  90. @example
  91. mysql> SELECT * FROM pet WHERE name REGEXP "^.@{5@}$";
  92. +-------+--------+---------+------+------------+-------+
  93. | name  | owner  | species | sex  | birth      | death |
  94. +-------+--------+---------+------+------------+-------+
  95. | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  96. | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  97. +-------+--------+---------+------+------------+-------+
  98. @end example
  99. @cindex rows, counting
  100. @cindex tables, counting rows
  101. @cindex counting, table rows
  102. @node Counting rows,  , Pattern matching, Retrieving data
  103. @subsubsection Counting Rows
  104. Databases are often used to answer the question, ``How often does a certain
  105. type of data occur in a table?''  For example, you might want to know how
  106. many pets you have, or how many pets each owner has, or you might want to
  107. perform various kinds of censuses on your animals.
  108. Counting the total number of animals you have is the same question as ``How
  109. many rows are in the @code{pet} table?'' because there is one record per pet.
  110. The @code{COUNT()} function counts the number of non-@code{NULL} results, so
  111. the query to count your animals looks like this:
  112. @example
  113. mysql> SELECT COUNT(*) FROM pet;
  114. +----------+
  115. | COUNT(*) |
  116. +----------+
  117. |        9 |
  118. +----------+
  119. @end example
  120. Earlier, you retrieved the names of the people who owned pets.  You can
  121. use @code{COUNT()} if you want to find out how many pets each owner has:
  122. @example
  123. mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
  124. +--------+----------+
  125. | owner  | COUNT(*) |
  126. +--------+----------+
  127. | Benny  |        2 |
  128. | Diane  |        2 |
  129. | Gwen   |        3 |
  130. | Harold |        2 |
  131. +--------+----------+
  132. @end example
  133. Note the use of @code{GROUP BY} to group together all records for each
  134. @code{owner}.  Without it, all you get is an error message:
  135. @example
  136. mysql> SELECT owner, COUNT(owner) FROM pet;
  137. ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
  138. with no GROUP columns is illegal if there is no GROUP BY clause
  139. @end example
  140. @code{COUNT()} and @code{GROUP BY} are useful for characterizing your
  141. data in various ways.  The following examples show different ways to
  142. perform animal census operations.
  143. Number of animals per species:
  144. @example
  145. mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
  146. +---------+----------+
  147. | species | COUNT(*) |
  148. +---------+----------+
  149. | bird    |        2 |
  150. | cat     |        2 |
  151. | dog     |        3 |
  152. | hamster |        1 |
  153. | snake   |        1 |
  154. +---------+----------+
  155. @end example
  156. Number of animals per sex:
  157. @example
  158. mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
  159. +------+----------+
  160. | sex  | COUNT(*) |
  161. +------+----------+
  162. | NULL |        1 |
  163. | f    |        4 |
  164. | m    |        4 |
  165. +------+----------+
  166. @end example
  167. (In this output, @code{NULL} indicates sex unknown.)
  168. Number of animals per combination of species and sex:
  169. @example
  170. mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
  171. +---------+------+----------+
  172. | species | sex  | COUNT(*) |
  173. +---------+------+----------+
  174. | bird    | NULL |        1 |
  175. | bird    | f    |        1 |
  176. | cat     | f    |        1 |
  177. | cat     | m    |        1 |
  178. | dog     | f    |        1 |
  179. | dog     | m    |        2 |
  180. | hamster | f    |        1 |
  181. | snake   | m    |        1 |
  182. +---------+------+----------+
  183. @end example
  184. You need not retrieve an entire table when you use @code{COUNT()}.  For
  185. example, the previous query, when performed just on dogs and cats, looks like
  186. this:
  187. @example
  188. mysql> SELECT species, sex, COUNT(*) FROM pet
  189.     -> WHERE species = "dog" OR species = "cat"
  190.     -> GROUP BY species, sex;
  191. +---------+------+----------+
  192. | species | sex  | COUNT(*) |
  193. +---------+------+----------+
  194. | cat     | f    |        1 |
  195. | cat     | m    |        1 |
  196. | dog     | f    |        1 |
  197. | dog     | m    |        2 |
  198. +---------+------+----------+
  199. @end example
  200. Or, if you wanted the number of animals per sex only for known-sex animals:
  201. @example
  202. mysql> SELECT species, sex, COUNT(*) FROM pet
  203.     -> WHERE sex IS NOT NULL
  204.     -> GROUP BY species, sex;
  205. +---------+------+----------+
  206. | species | sex  | COUNT(*) |
  207. +---------+------+----------+
  208. | bird    | f    |        1 |
  209. | cat     | f    |        1 |
  210. | cat     | m    |        1 |
  211. | dog     | f    |        1 |
  212. | dog     | m    |        2 |
  213. | hamster | f    |        1 |
  214. | snake   | m    |        1 |
  215. +---------+------+----------+
  216. @end example
  217. @cindex tables, multiple
  218. @node Multiple tables,  , Retrieving data, Database use
  219. @subsection Using More Than one Table
  220. The @code{pet} table keeps track of which pets you have.  If you want to
  221. record other information about them, such as events in their lives like
  222. visits to the vet or when litters are born, you need another table.  What
  223. should this table look like? It needs:
  224. @itemize @bullet
  225. @item
  226. To contain the pet name so you know which animal each event pertains
  227. to.
  228. @item
  229. A date so you know when the event occurred.
  230. @item
  231. A field to describe the event.
  232. @item
  233. An event type field, if you want to be able to categorize events.
  234. @end itemize
  235. Given these considerations, the @code{CREATE TABLE} statement for the
  236. @code{event} table might look like this:
  237. @example
  238. mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
  239.     -> type VARCHAR(15), remark VARCHAR(255));
  240. @end example
  241. As with the @code{pet} table, it's easiest to load the initial records
  242. by creating a tab-delimited text file containing the information:
  243. @multitable @columnfractions .15 .15 .15 .55
  244. @item Fluffy @tab 1995-05-15 @tab litter @tab 4 kittens, 3 female, 1 male
  245. @item Buffy @tab 1993-06-23 @tab litter @tab 5 puppies, 2 female, 3 male
  246. @item Buffy @tab 1994-06-19 @tab litter @tab 3 puppies, 3 female
  247. @item Chirpy @tab 1999-03-21 @tab vet @tab needed beak straightened
  248. @item Slim @tab 1997-08-03 @tab vet @tab broken rib
  249. @item Bowser @tab 1991-10-12 @tab kennel
  250. @item Fang @tab 1991-10-12 @tab kennel
  251. @item Fang @tab 1998-08-28 @tab birthday @tab Gave him a new chew toy
  252. @item Claws @tab 1998-03-17 @tab birthday @tab Gave him a new flea collar
  253. @item Whistler @tab 1998-12-09 @tab birthday @tab First birthday
  254. @end multitable
  255. Load the records like this:
  256. @example
  257. mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
  258. @end example
  259. Based on what you've learned from the queries you've run on the @code{pet}
  260. table, you should be able to perform retrievals on the records in the
  261. @code{event} table; the principles are the same.  But when is the
  262. @code{event} table by itself insufficient to answer questions you might ask?
  263. Suppose you want to find out the ages of each pet when they had their
  264. litters.  The @code{event} table indicates when this occurred, but to
  265. calculate the age of the mother, you need her birth date.  Because that is
  266. stored in the @code{pet} table, you need both tables for the query:
  267. @example
  268. mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark
  269.     -> FROM pet, event
  270.     -> WHERE pet.name = event.name AND type = "litter";
  271. +--------+------+-----------------------------+
  272. | name   | age  | remark                      |
  273. +--------+------+-----------------------------+
  274. | Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
  275. | Buffy  | 4.12 | 5 puppies, 2 female, 3 male |
  276. | Buffy  | 5.10 | 3 puppies, 3 female         |
  277. +--------+------+-----------------------------+
  278. @end example
  279. There are several things to note about this query:
  280. @itemize @bullet
  281. @item
  282. The @code{FROM} clause lists two tables because the query needs to pull
  283. information from both of them.
  284. @item
  285. When combining (joining) information from multiple tables, you need to
  286. specify how records in one table can be matched to records in the other.
  287. This is easy because they both have a @code{name} column.  The query uses
  288. @code{WHERE} clause to match up records in the two tables based on the
  289. @code{name} values.
  290. @item
  291. Because the @code{name} column occurs in both tables, you must be specific
  292. about which table you mean when referring to the column.  This is done
  293. by prepending the table name to the column name.
  294. @end itemize
  295. You need not have two different tables to perform a join.  Sometimes it is
  296. useful to join a table to itself, if you want to compare records in a table
  297. to other records in that same table.  For example, to find breeding pairs
  298. among your pets, you can join the @code{pet} table with itself to pair up
  299. males and females of like species:
  300. @example
  301. mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
  302.     -> FROM pet AS p1, pet AS p2
  303.     -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";
  304. +--------+------+--------+------+---------+
  305. | name   | sex  | name   | sex  | species |
  306. +--------+------+--------+------+---------+
  307. | Fluffy | f    | Claws  | m    | cat     |
  308. | Buffy  | f    | Fang   | m    | dog     |
  309. | Buffy  | f    | Bowser | m    | dog     |
  310. +--------+------+--------+------+---------+
  311. @end example
  312. In this query, we specify aliases for the table name in order
  313. to refer to the columns and keep straight which instance of the table
  314. each column reference is associated with.
  315. @cindex databases, information about
  316. @cindex tables, information about
  317. @findex DESCRIBE
  318. @node Getting information, Batch mode, Database use, Tutorial
  319. @section Getting Information About Databases and Tables
  320. What if you forget the name of a database or table, or what the structure of
  321. a given table is (for example, what its columns are called)?  @strong{MySQL}
  322. addresses this problem through several statements that provide information
  323. about the databases and tables it supports.
  324. You have already seen @code{SHOW DATABASES}, which lists the databases
  325. managed by the server.  To find out which database is currently selected,
  326. use the @code{DATABASE()} function:
  327. @example
  328. mysql> SELECT DATABASE();
  329. +------------+
  330. | DATABASE() |
  331. +------------+
  332. | menagerie  |
  333. +------------+
  334. @end example
  335. If you haven't selected any database yet, the result is blank.
  336. To find out what tables the current database contains (for example, when
  337. you're not sure about the name of a table), use this command:
  338. @example
  339. mysql> SHOW TABLES;
  340. +---------------------+
  341. | Tables in menagerie |
  342. +---------------------+
  343. | event               |
  344. | pet                 |
  345. +---------------------+
  346. @end example
  347. If you want to find out about the structure of a table, the @code{DESCRIBE}
  348. command is useful; it displays information about each of a table's columns:
  349. @example
  350. mysql> DESCRIBE pet;
  351. +---------+-------------+------+-----+---------+-------+
  352. | Field   | Type        | Null | Key | Default | Extra |
  353. +---------+-------------+------+-----+---------+-------+
  354. | name    | varchar(20) | YES  |     | NULL    |       |
  355. | owner   | varchar(20) | YES  |     | NULL    |       |
  356. | species | varchar(20) | YES  |     | NULL    |       |
  357. | sex     | char(1)     | YES  |     | NULL    |       |
  358. | birth   | date        | YES  |     | NULL    |       |
  359. | death   | date        | YES  |     | NULL    |       |
  360. +---------+-------------+------+-----+---------+-------+
  361. @end example
  362. @code{Field} indicates the column name, @code{Type} is the data type for
  363. the column, @code{Null} indicates whether or not the column can contain
  364. @code{NULL} values, @code{Key} indicates whether or not the column is
  365. indexed, and @code{Default} specifies the column's default value.
  366. If you have indexes on a table,
  367. @code{SHOW INDEX FROM tbl_name} produces information about them.
  368. @cindex modes, batch
  369. @cindex batch mode
  370. @cindex running, batch mode
  371. @cindex script files
  372. @cindex files, script
  373. @node Batch mode, Twin, Getting information, Tutorial
  374. @section Using @code{mysql} in Batch Mode
  375. In the previous sections, you used @code{mysql} interactively to enter
  376. queries and view the results.  You can also run @code{mysql} in batch
  377. mode.  To do this, put the commands you want to run in a file, then
  378. tell @code{mysql} to read its input from the file:
  379. @example
  380. shell> mysql < batch-file
  381. @end example
  382. If you need to specify connection parameters on the command line, the
  383. command might look like this:
  384. @example
  385. shell> mysql -h host -u user -p < batch-file
  386. Enter password: ********
  387. @end example
  388. When you use @code{mysql} this way, you are creating a script file, then
  389. executing the script.
  390. Why use a script?  Here are a few reasons:
  391. @itemize @bullet
  392. @item
  393. If you run a query repeatedly (say, every day or every week), making it a
  394. script allows you to avoid retyping it each time you execute it.
  395. @item
  396. You can generate new queries from existing ones that are similar by copying
  397. and editing script files.
  398. @item
  399. Batch mode can also be useful while you're developing a query, particularly
  400. for multiple-line commands or multiple-statement sequences of commands.  If
  401. you make a mistake, you don't have to retype everything.  Just edit your
  402. script to correct the error, then tell @code{mysql} to execute it again.
  403. @item
  404. If you have a query that produces a lot of output, you can run the output
  405. through a pager rather than watching it scroll off the top of your screen:
  406. @example
  407. shell> mysql < batch-file | more
  408. @end example
  409. @item
  410. You can catch the output in a file for further processing:
  411. @example
  412. shell> mysql < batch-file > mysql.out
  413. @end example
  414. @item
  415. You can distribute your script to other people so they can run the commands,
  416. too.
  417. @item
  418. Some situations do not allow for interactive use, for example, when you run
  419. a query from a @code{cron} job.  In this case, you must use batch mode.
  420. @end itemize
  421. The default output format is different (more concise) when you run
  422. @code{mysql} in batch mode than when you use it interactively.  For
  423. example, the output of @code{SELECT DISTINCT species FROM pet} looks like
  424. this when run interactively:
  425. @example
  426. +---------+
  427. | species |
  428. +---------+
  429. | bird    |
  430. | cat     |
  431. | dog     |
  432. | hamster |
  433. | snake   |
  434. +---------+
  435. @end example
  436. But like this when run in batch mode:
  437. @example
  438. species
  439. bird
  440. cat
  441. dog
  442. hamster
  443. snake
  444. @end example
  445. If you want to get the interactive output format in batch mode, use
  446. @code{mysql -t}.  To echo to the output the commands that are executed, use
  447. @code{mysql -vvv}.
  448. @cindex Twin Studies, queries
  449. @cindex queries, Twin Studeis project
  450. @node Twin,  , Batch mode, Tutorial
  451. @section Queries from Twin Project
  452. At Analytikerna and Lentus, we have been doing the systems and field work
  453. for a big research project. This project is a collaboration between the
  454. Institute of Environmental Medicine at Karolinska Institutet Stockholm
  455. and the Section on Clinical Research in Aging and Psychology at the
  456. University of Southern California.
  457. The project involves a screening part where all twins in Sweden older
  458. than 65 years are interviewed by telephone. Twins who meet certain
  459. criteria are passed on to the next stage. In this latter stage, twins who
  460. want to participate are visited by a doctor/nurse team. Some of the
  461. examinations include physical and neuropsychological examination,
  462. laboratory testing, neuroimaging, psychological status assessment, and family
  463. history collection. In addition, data are collected on medical and
  464. environmental risk factors.
  465. More information about Twin studies can be found at:
  466. @example
  467. @url{http://www.imm.ki.se/TWIN/TWINUKW.HTM}
  468. @end example
  469. The latter part of the project is administered with a Web interface
  470. written using Perl and @strong{MySQL}.
  471. Each night all data from the interviews are moved into a @strong{MySQL}
  472. database.
  473. @menu
  474. * Twin pool::                   Find all non-distributed twins
  475. * Twin event::                  Show a table on twin pair status
  476. @end menu
  477. @node Twin pool, Twin event, Twin, Twin
  478. @subsection Find all Non-distributed Twins
  479. The following query is used to determine who goes into the second part of the
  480. project:
  481. @example
  482. select
  483.         concat(p1.id, p1.tvab) + 0 as tvid,
  484.         concat(p1.christian_name, " ", p1.surname) as Name,
  485.         p1.postal_code as Code,
  486.         p1.city as City,
  487.         pg.abrev as Area,
  488.         if(td.participation = "Aborted", "A", " ") as A,
  489.         p1.dead as dead1,
  490.         l.event as event1,
  491.         td.suspect as tsuspect1,
  492.         id.suspect as isuspect1,
  493.         td.severe as tsevere1,
  494.         id.severe as isevere1,
  495.         p2.dead as dead2,
  496.         l2.event as event2,
  497.         h2.nurse as nurse2,
  498.         h2.doctor as doctor2,
  499.         td2.suspect as tsuspect2,
  500.         id2.suspect as isuspect2,
  501.         td2.severe as tsevere2,
  502.         id2.severe as isevere2,
  503.         l.finish_date
  504. from
  505.         twin_project as tp
  506.         /* For Twin 1 */
  507.         left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
  508.         left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
  509.         left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
  510.         left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
  511.         /* For Twin 2 */
  512.         left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
  513.         left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
  514.         left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
  515.         left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
  516.         person_data as p1,
  517.         person_data as p2,
  518.         postal_groups as pg
  519. where
  520.         /* p1 gets main twin and p2 gets his/her twin. */
  521.         /* ptvab is a field inverted from tvab */
  522.         p1.id = tp.id and p1.tvab = tp.tvab and
  523.         p2.id = p1.id and p2.ptvab = p1.tvab and
  524.         /* Just the sceening survey */
  525.         tp.survey_no = 5 and
  526.         /* Skip if partner died before 65 but allow emigration (dead=9) */
  527.         (p2.dead = 0 or p2.dead = 9 or
  528.          (p2.dead = 1 and
  529.           (p2.death_date = 0 or
  530.            (((to_days(p2.death_date) - to_days(p2.birthday)) / 365)
  531.             >= 65))))
  532.         and
  533.         (
  534.         /* Twin is suspect */
  535.         (td.future_contact = 'Yes' and td.suspect = 2) or
  536.         /* Twin is suspect - Informant is Blessed */
  537.         (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or
  538.         /* No twin - Informant is Blessed */
  539.         (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
  540.         /* Twin broken off - Informant is Blessed */
  541.         (td.participation = 'Aborted'
  542.          and id.suspect = 1 and id.future_contact = 'Yes') or
  543.         /* Twin broken off - No inform - Have partner */
  544.         (td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
  545.         and
  546.         l.event = 'Finished'
  547.         /* Get at area code */
  548.         and substring(p1.postal_code, 1, 2) = pg.code
  549.         /* Not already distributed */
  550.         and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
  551.         /* Has not refused or been aborted */
  552.         and not (h.status = 'Refused' or h.status = 'Aborted'
  553.         or h.status = 'Died' or h.status = 'Other')
  554. order by
  555.         tvid;
  556. @end example
  557. Some explanations:
  558. @table @asis
  559. @item @code{concat(p1.id, p1.tvab) + 0 as tvid}
  560. We want to sort on the concatenated @code{id} and @code{tvab} in
  561. numerical order. Adding @code{0} to the result causes @strong{MySQL} to
  562. treat the result as a number.
  563. @item column @code{id}
  564. This identifies a pair of twins. It is a key in all tables.
  565. @item column @code{tvab}
  566. This identifies a twin in a pair. It has a value of @code{1} or @code{2}.
  567. @item column @code{ptvab}
  568. This is an inverse of @code{tvab}. When @code{tvab} is @code{1} this is
  569. @code{2}, and vice versa. It exists to save typing and to make it easier for
  570. @strong{MySQL} to optimize the query.
  571. @end table
  572. This query demonstrates, among other things, how to do lookups on a
  573. table from the same table with a join (@code{p1} and @code{p2}). In the example, this
  574. is used to check whether a twin's partner died before the age of 65. If so,
  575. the row is not returned.
  576. All of the above exist in all tables with twin-related information. We
  577. have a key on both @code{id,tvab} (all tables), and @code{id,ptvab}
  578. (@code{person_data}) to make queries faster.
  579. On our production machine (A 200MHz UltraSPARC), this query returns
  580. about 150-200 rows and takes less than one second.
  581. The current number of records in the tables used above:
  582. @multitable @columnfractions .3 .5
  583. @item @strong{Table}            @tab @strong{Rows}
  584. @item @code{person_data}        @tab 71074
  585. @item @code{lentus} @tab 5291
  586. @item @code{twin_project}       @tab 5286
  587. @item @code{twin_data} @tab 2012
  588. @item @code{informant_data} @tab 663
  589. @item @code{harmony} @tab 381
  590. @item @code{postal_groups} @tab 100
  591. @end multitable
  592. @node Twin event,  , Twin pool, Twin
  593. @subsection Show a Table on Twin Pair Status
  594. Each interview ends with a status code called @code{event}. The query
  595. shown below is used to display a table over all twin pairs combined by
  596. event. This indicates in how many pairs both twins are finished, in how many
  597. pairs one twin is finished and the other refused, and so on.
  598. @example
  599. select
  600.         t1.event,
  601.         t2.event,
  602.         count(*)
  603. from
  604.         lentus as t1,
  605.         lentus as t2,
  606.         twin_project as tp
  607. where
  608.         /* We are looking at one pair at a time */
  609.         t1.id = tp.id
  610.         and t1.tvab=tp.tvab
  611.         and t1.id = t2.id
  612.         /* Just the sceening survey */
  613.         and tp.survey_no = 5
  614.         /* This makes each pair only appear once */
  615.         and t1.tvab='1' and t2.tvab='2'
  616. group by
  617.         t1.event, t2.event;
  618. @end example
  619. @cindex functions, server
  620. @cindex server functions
  621. @node Server, Replication, Tutorial, Top
  622. @chapter MySQL Server Functions
  623. @menu
  624. * Languages::                   What languages are supported by @strong{MySQL}?
  625. * Table size::                  How big @strong{MySQL} tables can be
  626. @end menu
  627. @cindex error messages, languages
  628. @cindex messages, languages
  629. @cindex files, error messages
  630. @cindex language support
  631. @node Languages, Table size, Server, Server
  632. @section What Languages Are Supported by MySQL?
  633. @code{mysqld} can issue error messages in the following languages:
  634. Czech, Danish, Dutch, English (the default), Estonian, French, German, Greek,
  635. Hungarian, Italian, Japanese, Korean, Norwegian, Norwegian-ny, Polish,
  636. Portuguese, Romanian, Russian, Slovak, Spanish, and Swedish.
  637. To start @code{mysqld} with a particular language, use either the
  638. @code{--language=lang} or @code{-L lang} options. For example:
  639. @example
  640. shell> mysqld --language=swedish
  641. @end example
  642. or:
  643. @example
  644. shell> mysqld --language=/usr/local/share/swedish
  645. @end example
  646. Note that all language names are specified in lowercase.
  647. The language files are located (by default) in
  648. @file{@var{mysql_base_dir}/share/@var{LANGUAGE}/}.
  649. To update the error message file, you should edit the @file{errmsg.txt} file
  650. and execute the following command to generate the @file{errmsg.sys} file:
  651. @example
  652. shell> comp_err errmsg.txt errmsg.sys
  653. @end example
  654. If you upgrade to a newer version of @strong{MySQL}, remember to repeat
  655. your changes with the new @file{errmsg.txt} file.
  656. @menu
  657. * Character sets::              The character set used for data and sorting
  658. * Adding character set::        Adding a new character set
  659. * Character arrays::            The character definition arrays
  660. * String collating::            String collating support
  661. * Multi-byte characters::       Multi-byte character support
  662. @end menu
  663. @cindex character sets
  664. @cindex data, character sets
  665. @cindex sorting, character sets
  666. @node Character sets, Adding character set, Languages, Languages
  667. @subsection The Character Set Used for Data and Sorting
  668. By default, @strong{MySQL} uses the ISO-8859-1 (Latin1) character
  669. set. This is the character set used in the USA and western Europe.
  670. All standard @strong{MySQL} binaries are compiled with
  671. @code{--with-extra-charsets=complex}.  This will add code to all
  672. standard programs to be able to handle @code{latin1} and all multi-byte
  673. character sets within the binary. Other character sets will be
  674. loaded from a character-set definition file when needed.
  675. The character set determines what characters are allowed in names and how
  676. things are sorted by the @code{ORDER BY} and @code{GROUP BY} clauses of
  677. the @code{SELECT} statement.
  678. You can change the character set with the
  679. @code{--default-character-set} option when you start the server.
  680. The character sets available depend on the @code{--with-charset=charset}
  681. option to @code{configure}, and the character set configuration files
  682. listed in @file{SHAREDIR/charsets/Index}.
  683. @xref{Quick install}.
  684. If you change the character set when running MySQL (which may also
  685. change the sort order), you must run myisamchk -r -q on all
  686. tables. Otherwise your indexes may not be ordered correctly.
  687. When a client connects to a @strong{MySQL} server, the server sends the
  688. default character set in use to the client.  The client will switch to
  689. use this character set for this connection.
  690. One should use @code{mysql_real_escape_string()} when escaping strings
  691. for a SQL query.  @code{mysql_real_escape_string()} is identical to the
  692. old @code{mysql_escape_string()} function, except that it takes the MYSQL
  693. connection handle as the first parameter.
  694. If the client is compiled with different paths than where the server is
  695. installed and the user who configured @strong{MySQL} didn't included all
  696. character sets in the @strong{MySQL} binary, one must specify for
  697. the client where it can find the additional character sets it will need
  698. if the server runs with a different character set than the client.
  699. One can specify this by putting in a @strong{MySQL} option file:
  700. @example
  701. [client]
  702. character-sets-dir=/usr/local/mysql/share/mysql/charsets
  703. @end example
  704. where the path points to where the dynamic @strong{MySQL} character sets
  705. are stored.
  706. One can force the client to use specific character set by specifying:
  707. @example
  708. [client]
  709. default-character-set=character-set-name
  710. @end example
  711. but normally this is never needed.
  712. @cindex character sets, adding
  713. @cindex adding, character sets
  714. @node Adding character set, Character arrays, Character sets, Languages
  715. @subsection Adding a New Character Set
  716. To add another character set to @strong{MySQL}, use the following procedure.
  717. Decide if the set is simple or complex.  If the character set
  718. does not need to use special string collating routines for
  719. sorting and does not need multi-byte character support, it is
  720. simple.  If it needs either of those features, it is complex.
  721. For example, @code{latin1} and @code{danish} are simple charactersets while
  722. @code{big5} or @code{czech} are complex character sets.
  723. In the following section, we have assumed that you name your character
  724. set @code{MYSET}.
  725. For a simple character set do the following:
  726. @enumerate
  727. @item
  728. Add MYSET to the end of the @file{sql/share/charsets/Index} file
  729. Assign an unique number to it.
  730. @item
  731. Create the file @file{sql/share/charsets/MYSET.conf}.
  732. (You can use @file{sql/share/charsets/latin1.conf} as a base for this).
  733. The syntax for the file very simple:
  734. @itemize @bullet
  735. @item
  736. Comments start with a '#' character and proceed to the end of the line.
  737. @item
  738. Words are separated by arbitrary amounts of whitespace.
  739. @item
  740. When defining the character set, every word must be a number in hexadecimal
  741. format
  742. @item
  743. The @code{ctype} array takes up the first 257 words. The
  744. @code{to_lower}, @code{to_upper} and @code{sort_order} arrays take up
  745. 256 words each after that.
  746. @end itemize
  747. @xref{Character arrays}.
  748. @item
  749. Add the character set name to the @code{CHARSETS_AVAILABLE} and
  750. @code{COMPILED_CHARSETS} lists in @code{configure.in}.
  751. @item
  752. Reconfigure, recompile, and test.
  753. @end enumerate
  754. For a complex character set do the following:
  755. @enumerate
  756. @item
  757. Create the file @file{strings/ctype-MYSET.c} in the @strong{MySQL} source
  758. distribution.
  759. @item
  760. Add MYSET to the end of the @file{sql/share/charsets/Index} file.
  761. Assign an unique number to it.
  762. @item
  763. Look at one of the existing @file{ctype-*.c} files to see what needs to
  764. be defined, for example @file{strings/ctype-big5.c}. Note that the
  765. arrays in your file must have names like @code{ctype_MYSET},
  766. @code{to_lower_MYSET}, and so on.  This corresponds to the arrays
  767. in the simple character set. @xref{Character arrays}.  For a complex
  768. character set
  769. @item
  770. Near the top of the file, place a special comment like this:
  771. @example
  772. /*
  773.  * This comment is parsed by configure to create ctype.c,
  774.  * so don't change it unless you know what you are doing.
  775.  *
  776.  * .configure. number_MYSET=MYNUMBER
  777.  * .configure. strxfrm_multiply_MYSET=N
  778.  * .configure. mbmaxlen_MYSET=N
  779.  */
  780. @end example
  781. The @code{configure} program uses this comment to include
  782. the character set into the @strong{MySQL} library automatically.
  783. The strxfrm_multiply and mbmaxlen lines will be explained in
  784. the following sections.  Only include them if you the string
  785. collating functions or the multi-byte character set functions,
  786. respectively.
  787. @item
  788. You should then create some of the following functions:
  789. @itemize @bullet
  790. @item @code{my_strncoll_MYSET()}
  791. @item @code{my_strcoll_MYSET()}
  792. @item @code{my_strxfrm_MYSET()}
  793. @item @code{my_like_range_MYSET()}
  794. @end itemize
  795. @xref{String collating}.
  796. @item
  797. Add the character set name to the @code{CHARSETS_AVAILABLE} and
  798. @code{COMPILED_CHARSETS} lists in @code{configure.in}.
  799. @item
  800. Reconfigure, recompile, and test.
  801. @end enumerate
  802. The file @file{sql/share/charsets/README} includes some more instructions.
  803. If you want to have the character set included in the @strong{MySQL}
  804. distribution, mail a patch to @email{internals@@lists.mysql.com}.
  805. @node Character arrays, String collating, Adding character set, Languages
  806. @subsection The character definition arrays
  807. @code{to_lower[]} and @code{to_upper[]} are simple arrays that hold the
  808. lowercase and uppercase characters corresponding to each member of the
  809. character set.  For example:
  810. @example
  811. to_lower['A'] should contain 'a'
  812. to_upper['a'] should contain 'A'
  813. @end example
  814. @code{sort_order[]} is a map indicating how characters should be ordered for
  815. comparison and sorting purposes.  For many character sets, this is the same as
  816. @code{to_upper[]} (which means sorting will be case insensitive).
  817. @strong{MySQL} will sort characters based on the value of
  818. @code{sort_order[character]}.  For more complicated sorting rules, see
  819. the discussion of string collating below. @xref{String collating}.
  820. @code{ctype[]} is an array of bit values, with one element for one character.
  821. (Note that @code{to_lower[]}, @code{to_upper[]}, and @code{sort_order[]}
  822. are indexed by character value, but @code{ctype[]} is indexed by character
  823. value + 1.  This is an old legacy to be able to handle EOF.)
  824. You can find the following bitmask definitions in @file{m_ctype.h}:
  825. @example
  826. #define _U      01      /* Uppercase */
  827. #define _L      02      /* Lowercase */
  828. #define _N      04      /* Numeral (digit) */
  829. #define _S      010     /* Spacing character */
  830. #define _P      020     /* Punctuation */
  831. #define _C      040     /* Control character */
  832. #define _B      0100    /* Blank */
  833. #define _X      0200    /* heXadecimal digit */
  834. @end example
  835. The @code{ctype[]} entry for each character should be the union of the
  836. applicable bitmask values that describe the character.  For example,
  837. @code{'A'} is an uppercase character (@code{_U}) as well as a
  838. hexadecimal digit (@code{_X}), so @code{ctype['A'+1]} should contain the
  839. value:
  840. @example
  841. _U + _X = 01 + 0200 = 0201
  842. @end example
  843. @cindex collating, strings
  844. @cindex string collating
  845. @node String collating, Multi-byte characters, Character arrays, Languages
  846. @subsection String Collating Support
  847. If the sorting rules for your language are too complex to be handled
  848. with the simple @code{sort_order[]} table, you need to use the string
  849. collating functions.
  850. Right now the best documentation on this is the character sets that are
  851. already implemented.  Look at the big5, czech, gbk, sjis, and tis160
  852. character sets for examples.
  853. You must specify the @code{strxfrm_multiply_MYSET=N} value in the
  854. special comment at the top of the file.  @code{N} should be set to
  855. the maximum ratio the strings may grow during @code{my_strxfrm_MYSET} (it
  856. must be a positive integer).
  857. @cindex characters, multi-byte
  858. @cindex multi-byte characters
  859. @node Multi-byte characters,  , String collating, Languages
  860. @subsection Multi-byte Character Support
  861. If your want to add support for a new character set that includes
  862. multi-byte characters, you need to use the multi-byte character
  863. functions.
  864. Right now the best documentation on this is the character sets that are
  865. already implemented.  Look at the euc_kr, gb2312, gbk, sjis and ujis
  866. character sets for examples. These are implemented in the
  867. @code{ctype-'charset'.c} files in the @file{strings} directory.
  868. You must specify the @code{mbmaxlen_MYSET=N} value in the special
  869. comment at the top of the source file.  @code{N} should be set to the
  870. size in bytes of the largest character in the set.
  871. @cindex tables, maximum size
  872. @cindex size of tables
  873. @cindex operating systems, file size limits
  874. @cindex limits, file size
  875. @cindex files, size limits
  876. @node Table size,  , Languages, Server
  877. @section How Big MySQL Tables Can Be
  878. @strong{MySQL} Version 3.22 has a 4G limit on table size. With the new
  879. @code{MyISAM} in @strong{MySQL} Version 3.23 the maximum table size is
  880. pushed up to 8 million terabytes (2 ^ 63 bytes).
  881. Note, however, that operating systems have their own file size
  882. limits. Here are some examples:
  883. @multitable @columnfractions .5 .5
  884. @item @strong{Operating System} @tab @strong{File Size Limit}
  885. @item Linux-Intel 32 bit@tab 2G, 4G or bigger depending on Linux version
  886. @item Linux-Alpha @tab 8T (?)
  887. @item Solaris 2.5.1 @tab 2G (possible 4G with patch)
  888. @item Solaris 2.6 @tab 4G
  889. @item Solaris 2.7 Intel @tab 4G
  890. @item Solaris 2.7 ULTRA-SPARC @tab 8T (?)
  891. @end multitable
  892. On Linux 2.2 you can get bigger tables than 2G by using the LFS patch for
  893. the ext2 file system.  On Linux 2.4 there exists also patches for ReiserFS
  894. to get support for big files.
  895. This means that the table size for @strong{MySQL} is normally limited by
  896. the operating system.
  897. By default, @strong{MySQL} tables have a maximum size of about 4G.  You can
  898. check the maximum table size for a table with the @code{SHOW TABLE STATUS}
  899. command or with the @code{myisamchk -dv table_name}.
  900. @xref{SHOW}.
  901. If you need bigger tables than 4G (and your operating system supports
  902. this), you should set the @code{AVG_ROW_LENGTH} and @code{MAX_ROWS}
  903. parameter when you create your table.  @xref{CREATE TABLE}.  You can
  904. also set these later with @code{ALTER TABLE}. @xref{ALTER TABLE}.
  905. If your big table is going to be read-only, you could use
  906. @code{myisampack} to merge and compress many tables to one.
  907. @code{myisampack} usually compresses a table by at least 50%, so you can
  908. have, in effect, much bigger tables.  @xref{myisampack, ,
  909. @code{myisampack}}.
  910. You can go around the operating system file limit for @code{MyISAM} data
  911. files by using the @code{RAID} option. @xref{CREATE TABLE}.
  912. Another solution can be the included MERGE library, which allows you to
  913. handle a collection of identical tables as one. @xref{MERGE, MERGE
  914. tables}.
  915. @cindex replication
  916. @cindex increasing, speed
  917. @cindex speed, increasing
  918. @cindex databases, replicating
  919. @node Replication, Performance, Server, Top
  920. @chapter Replication in MySQL
  921. @menu
  922. * Replication Intro::           Introduction
  923. * Replication Implementation::  Replication Implementation Overview
  924. * Replication HOWTO::           HOWTO
  925. * Replication Features::        Replication Features
  926. * Replication Options::         Replication Options in my.cnf
  927. * Replication SQL::             SQL Commands related to replication
  928. * Replication FAQ::             Frequently Asked Questions about replication
  929. * Replication Problems:: Troubleshooting Replication.
  930. @end menu
  931. @node Replication Intro, Replication Implementation, Replication, Replication
  932. @section Introduction
  933. One way replication can be used is to increase both robustness and
  934. speed. For robustness you can have two systems and can switch to the backup if
  935. you have problems with the master. The extra speed is achieved by
  936. sending a part of the non-updating queries to the replica server. Of
  937. course this only works if non-updating queries dominate, but that is the
  938. normal case.
  939. Starting in Version 3.23.15, @strong{MySQL} supports one-way replication
  940. internally. One server acts as the master, while the other acts as the
  941. slave. Note that one server could play the roles of master in one pair
  942. and slave in the other. The master server keeps a binary log of updates
  943. (@xref{Binary log}.) and an index file to binary logs to keep track of
  944. log rotation.  The slave, upon connecting, informs the master where it
  945. left off since the last successfully propagated update, catches up on
  946. the updates, and then blocks and waits for the master to notify it of
  947. the new updates.
  948. Note that if you are replicating a database, all updates to this
  949. database should be done through the master!
  950. On older servers one can use the update log to do simple replication.
  951. @xref{Log Replication}.
  952. Another benefit of using replication is that one can get live backups of
  953. the system by doing a backup on a slave instead of doing it on the
  954. master. @xref{Backup}.
  955. @cindex master-slave setup
  956. @node Replication Implementation, Replication HOWTO, Replication Intro, Replication
  957. @section Replication Implementation Overview
  958. @strong{MySQL} replication is based on the server keeping track of all
  959. changes to your database (updates, deletes, etc) in the binary
  960. log. (@xref{Binary log}.) and the slave server(s) reading the saved
  961. queries from the master server's binary log so that the slave can
  962. execute the same queries on its copy of the data.
  963. It is @strong{very important} to realize that the binary log is simply a
  964. record starting from a fixed point in time (the moment you enable binary
  965. logging). Any slaves which you set up will need copies of all the data
  966. from your master as it existed the moment that you enabled binary
  967. logging on the master. If you start your slaves with data that doesn't
  968. agree with what was on the master @strong{when the binary log was
  969. started}, your slaves may fail.
  970. A future version (4.0) of @strong{MySQL} will remove the need to keep a
  971. (possibly large) snapshot of data for new slaves that you might wish to
  972. set up through the live backup functionality with no locking required.
  973. However, at this time, it is necessary to block all writes either with a
  974. global read lock or by shutting down the master while taking a snapshot.
  975. Once a slave is properly configured and running, it will simply connect
  976. to the master and wait for updates to process. If the master goes away
  977. or the slave loses connectivity with your master, it will keep trying to
  978. connect every @code{master-connect-retry} seconds until it is able to
  979. reconnect and resume listening for updates.
  980. Each slave keeps track of where it left off. The master server has no
  981. knowledge of how many slaves there are or which ones are up-to-date at
  982. any given time.
  983. The next section explains the master/slave setup process in more detail.
  984. @node Replication HOWTO, Replication Features, Replication Implementation, Replication
  985. @section HOWTO
  986. Below is a quick description of how to set up complete replication on
  987. your current @strong{MySQL} server. It assumes you want to replicate all
  988. your databases and have not configured replication before. You will need
  989. to shutdown your master server briefly to complete the steops outlined
  990. below.
  991. @enumerate
  992. @item
  993. Make sure you have a recent version of @strong{MySQL} installed on the master
  994. and slave(s).
  995. Use Version 3.23.29 or higher. Previous releases used a different binary
  996. log format and had bugs which have been fixed in newer releases. Please,
  997. do not report bugs until you have verified that the problem is present
  998. in the latest release.
  999. @item
  1000. Set up special a replication user on the master with the @code{FILE}
  1001. privilege and permission to connect from all the slaves. If the user is
  1002. only doing replication (which is recommended), you don't need to grant any
  1003. additional privileges.
  1004. For example, to create a user named @code{repl} which can access your
  1005. master from any host, you might use this command:
  1006. @example
  1007. GRANT FILE ON *.* TO repl@@"%" IDENTIFIED BY '<password>';
  1008. @end example
  1009. @item
  1010. Shut down @strong{MySQL} on the master.
  1011. @example
  1012. mysqladmin -u root -p<password> shutdown
  1013. @end example
  1014. @item
  1015. Snapshot all the data on your master server.
  1016. The easiest way to do this (on Unix) is to simply use @strong{tar} to
  1017. produce an archvie of your entrie data directory. The exact data
  1018. directory location depends on your installation.
  1019. @example
  1020. tar -cvf /tmp/mysql-snapshot.tar /path/to/data-dir
  1021. @end example
  1022. Windows users can use WinZip or similar software to create an archive of
  1023. the data directory.
  1024. @item
  1025. In @code{my.cnf} on the master add @code{log-bin} and
  1026. @code{server-id=unique number} to the @code{[mysqld]} section and
  1027. restart it. It is very important that the id of the slave is different from
  1028. the id of the master. Think of @code{server-id} as something similar
  1029. to the IP address - it uniquely identifies the server instance in the
  1030. comminity of replication partners.
  1031. @example
  1032. [mysqld]
  1033. log-bin
  1034. server-id=1
  1035. @end example
  1036. @item
  1037. Restart @strong{MySQL} on the master.
  1038. @item
  1039. Add the following to @code{my.cnf} on the slave(s):
  1040. @example
  1041. master-host=<hostname of the master>
  1042. master-user=<replication user name>
  1043. master-password=<replication user password>
  1044. master-port=<TCP/IP port for master>
  1045. server-id=<some unique number between 2 and 2^32-1>
  1046. @end example
  1047. replacing the values in <> with what is relevant to your system.
  1048. @code{server-id} must be different for each server participating in
  1049. replication.  If you don't specify a server-id, it will be set to 1 if
  1050. you have not defined @code{master-host}, else it will be set to 2. Note
  1051. that in the case of @code{server-id} omission the master will refuse
  1052. connections from all slaves, and the slave will refuse to connect to a
  1053. master. Thus, omitting @code{server-id} is only good for backup with a
  1054. binary log.
  1055. @item
  1056. Copy the snapshot data into your data directory on your slave(s). Make
  1057. sure that the privileges on the files and directories are correct. The
  1058. user which @strong{MySQL} runs as needs to be able to read and write to
  1059. them, just as on the master.
  1060. @item Restart the slave(s).
  1061. @end enumerate
  1062. After you have done the above, the slave(s) should connect to the master
  1063. and catch up on any updates which happened since the snapshot was taken.
  1064. If you have forgotten to set @code{server-id} for the slave you will get
  1065. the following error in the error log file:
  1066. @example
  1067. Warning: one should set server_id to a non-0 value if master_host is set.
  1068. The server will not act as a slave.
  1069. @end example
  1070. If you have forgot to do this for the master, the slaves will not be
  1071. able to connect to the master.
  1072. If a slave is not able to replicate for any reason, you will find error
  1073. messages in the error log on the slave.
  1074. Once a slave is replicating, you will find a file called
  1075. @code{master.info} in the same directory as your error log. The
  1076. @code{master.info} file is used by the slave to keep track of how much
  1077. of the master's binary log is has processed. @strong{Do not} remove or
  1078. edit the file, unless you really know what you are doing. Even in that case,
  1079. it is preferred that you use @code{CHANGE MASTER TO} command.
  1080. @cindex options, replication
  1081. @cindex @code{my.cnf} file
  1082. @cindex files,@code{my.cnf}
  1083. @node Replication Features, Replication Options, Replication HOWTO, Replication
  1084. @section Replication Features and known problems
  1085. Below is an explanation of what is supported and what is not:
  1086. @itemize @bullet
  1087. @item
  1088. Replication will be done correctly with @code{AUTO_INCREMENT},
  1089. @code{LAST_INSERT_ID}, and @code{TIMESTAMP} values.
  1090. @item
  1091. @code{RAND()} in updates does not replicate properly. Use
  1092. @code{RAND(some_non_rand_expr)} if you are replcating updates with
  1093. @code{RAND()}. You can, for example, use @code{UNIX_TIMESTAMP()} for the
  1094. argument to @code{RAND()}.
  1095. @item
  1096. @code{LOAD DATA INFILE} will be handled properly as long as the file
  1097. still resides on the master server at the time of update
  1098. propagation. @code{LOAD LOCAL DATA INFILE} will be skipped.
  1099. @item
  1100. Update queries that use user variables are not replication-safe (yet).
  1101. @item
  1102. @code{FLUSH} commands are not stored in the binary log and are because
  1103. of this not replicated to the slaves. This is not normally a problem as
  1104. @code{FLUSH} doesn't change anything. This does however mean that if you
  1105. update the @code{MySQL} privilege tables directly without using
  1106. @code{GRANT} statement and you replicate the @code{MySQL} privilege
  1107. database, you must do a @code{FLUSH PRIVILEGES} on your slaves to put
  1108. the new privileges into effect.
  1109. @item
  1110. Temporary tables starting in 3.23.29 are replicated properly with the
  1111. exception of the case when you shut down slave server ( not just slave thread),
  1112. you have some temporary tables open, and the are used in subsequent updates.
  1113. To deal with this problem, to shut down the slave, do @code{SLAVE STOP}, then
  1114. check @code{Slave_open_temp_tables} variable to see if it is 0, then issue
  1115. @code{mysqladmin shutdown}. If the number is not 0, restart the slave thread
  1116. with @code{SLAVE START} and see
  1117. if you have better luck next time. There will be a cleaner solution, but it
  1118. has to wait until version 4.0.
  1119. In earlier versions temporary tables are not being replicated properly - we
  1120. recommend that you either upgrade, or execute @code{SET SQL_LOG_BIN=0} on
  1121. your clients before all queries with temp tables.
  1122. @item
  1123. @strong{MySQL} only supports one master and many slaves. We will in 4.x
  1124. add a voting algorithm to automaticly change master if something goes
  1125. wrong with the current master. We will also introduce 'agent' processes
  1126. to help doing load balancing by sending select queries to different
  1127. slaves.
  1128. @item
  1129. Starting in Version 3.23.26, it is safe to connect servers in a circular
  1130. master-slave relationship with @code{log-slave-updates} enabled.
  1131. Note, however, that many queries will not work right in this kind of
  1132. setup unless your client code is written to take care of the potential
  1133. problems that can happen from updates that occur in different sequence
  1134. on different servers. Note that the log format has changed in Version 3.23.26
  1135. so that pre-3.23.26 slaves will not be able to read it.
  1136. @item
  1137. If the query on the slave gets an error, the slave thread will
  1138. terminate, and a message will appear in the @code{.err} file. You should
  1139. then connect to the slave manually, fix the cause of the error (for
  1140. example, non-existent table), and then run @code{SLAVE START} sql
  1141. command (available starting in Version 3.23.16). In Version 3.23.15, you
  1142. will have to restart the server.
  1143. @item
  1144. If connection to the master is lost, the slave will retry immediately,
  1145. and then in case of failure every @code{master-connect-retry} (default
  1146. 60) seconds. Because of this, it is safe to shut down the master, and
  1147. then restart it after a while. The slave will also be able to deal with
  1148. network connectivity outages.
  1149. @item
  1150. Shutting down the slave (cleanly) is also safe, as it keeps track of
  1151. where it left off.  Unclean shutdowns might produce problems, especially
  1152. if disk cache was not synced before the system died. Your system fault
  1153. tolerance will be greatly increased if you have a good UPS.
  1154. @item
  1155. If the master is listening on a non-standard port, you will also need to
  1156. specify this with @code{master-port} parameter in @code{my.cnf} .
  1157. @item
  1158. In Version 3.23.15, all of the tables and databases will be
  1159. replicated. Starting in Version 3.23.16, you can restrict replication to
  1160. a set of databases with @code{replicate-do-db} directives in
  1161. @code{my.cnf} or just exclude a set of databases with
  1162. @code{replicate-ignore-db}. Note that up until Version 3.23.23, there was a bug
  1163. that did not properly deal with @code{LOAD DATA INFILE} if you did it in
  1164. a database that was excluded from replication.
  1165. @item
  1166. Starting in Version 3.23.16, @code{SET SQL_LOG_BIN = 0} will turn off
  1167. replication (binary) logging on the master, and @code{SET SQL_LOG_BIN =
  1168. 1} will turn in back on - you must have the process privilege to do
  1169. this.
  1170. @item
  1171. Starting in Version 3.23.19, you can clean up stale replication leftovers when
  1172. something goes wrong and you want a clean start with @code{FLUSH MASTER}
  1173. and @code{FLUSH SLAVE} commands. In Version 3.23.26 we have renamed them to
  1174. @code{RESET MASTER} and @code{RESET SLAVE} respectively to clarify
  1175. what they do. The old @code{FLUSH} variants still work, though, for
  1176. compatibility.
  1177. @item
  1178. Starting in Version 3.23.21, you can use @code{LOAD TABLE FROM MASTER} for
  1179. network backup and to set up replication initially. We have recently
  1180. received a number of bug reports concerning it that we are investigating, so
  1181. we recommend that you use it only in testing until we make it more stable.
  1182. @item
  1183. Starting in Version 3.23.23, you can change masters and adjust log position
  1184. with @code{CHANGE MASTER TO}.
  1185. @item
  1186. Starting in Version 3.23.23, you tell the master that updates in certain
  1187. databases should not be logged to the binary log with @code{binlog-ignore-db}.
  1188. @item
  1189. Starting in Version 3.23.26, you can use @code{replicate-rewrite-db} to tell
  1190. the slave to apply updates from one database on the master to the one
  1191. with a different name on the slave.
  1192. @item
  1193. Starting in Version 3.23.28, you can use @code{PURGE MASTER LOGS TO 'log-name'}
  1194. to get rid of old logs while the slave is running.
  1195. @end itemize
  1196. @node Replication Options, Replication SQL, Replication Features, Replication
  1197. @section Replication Options in my.cnf
  1198. If you are using replication, we recommend you to use MySQL Version 3.23.30 or
  1199. later. Older versions work, but they do have some bugs and are missing some
  1200. features.
  1201. On both master and slave you need to use the @code{server-id} option.
  1202. This sets an unique replication id. You should pick a unique value in the
  1203. range between 1 to 2^32-1 for each master and slave.
  1204. Example: @code{server-id=3}
  1205. The following table has the options you can use for the @strong{MASTER}:
  1206. @multitable @columnfractions .3 .7
  1207. @item @strong{Option} @tab @strong{Description}
  1208. @item @code{log-bin=filename} @tab
  1209. Write to a binary update log to the specified location. Note that if you
  1210. give it a parameter with an extension
  1211. (for example, @code{log-bin=/mysql/logs/replication.log} ) versions up to 3.23.24
  1212. will not work right during replication if you do @code{FLUSH LOGS} . The
  1213. problem is fixed in Version 3.23.25. If you are using this kind of log name,
  1214. @code{FLUSH LOGS} will be ignored on binlog. To clear the log, run
  1215. @code{FLUSH MASTER}, and do not forget to run @code{FLUSH SLAVE} on all
  1216. slaves. In Version 3.23.26 and in later versions you should use @code{RESET MASTER}
  1217. and @code{RESET SLAVE}
  1218. @item @code{log-bin-index=filename} @tab
  1219. Because the user could issue the @code{FLUSH LOGS} command, we need to
  1220. know which log is currently active and which ones have been rotated out
  1221. and in what sequence. This information is stored in the binary log index file.
  1222. The default is `hostname`.index. You can use this option if you want to
  1223. be a rebel.  (Example: @code{log-bin-index=db.index})
  1224. @item @code{sql-bin-update-same} @tab
  1225. If set, setting @code{SQL_LOG_BIN} to a value will automatically set
  1226. @code{SQL_LOG_UPDATE} to the same value and vice versa.
  1227. @item @code{binlog-do-db=database_name} @tab
  1228. Tells the master it should log updates for the specified database, and
  1229. exclude all others not explicitly mentioned.
  1230. (Example: @code{binlog-do-db=some_database})
  1231. @item @code{binlog-ignore-db=database_name} @tab
  1232. Tells the master that updates to the given database should not be logged
  1233. to the binary log (Example: @code{binlog-ignore-db=some_database})
  1234. @end multitable
  1235. The following table has the options you can use for the @strong{SLAVE}:
  1236. @multitable @columnfractions .3 .7
  1237. @item @strong{Option} @tab @strong{Description}
  1238. @item @code{master-host=host} @tab
  1239. Master hostname or IP address for replication. If not set, the slave
  1240. thread will not be started.
  1241. (Example: @code{master-host=db-master.mycompany.com})
  1242. @item @code{master-user=username} @tab
  1243. The user the slave thread will us for authentication when connecting to
  1244. the master. The user must have @code{FILE} privilege. If the master user
  1245. is not set, user @code{test} is assumed.  (Example:
  1246. @code{master-user=scott})
  1247. @item @code{master-password=password} @tab
  1248. The password the slave thread will authenticate with when connecting to
  1249. the master. If not set, an empty password is assumed. (Example:
  1250. @code{master-password=tiger})
  1251. @item @code{master-port=portnumber} @tab
  1252. The port the master is listening on. If not set, the compiled setting of
  1253. @code{MYSQL_PORT} is assumed. If you have not tinkered with
  1254. @code{configure} options, this should be 3306.  (Example:
  1255. @code{master-port=3306})
  1256. @item @code{master-connect-retry=seconds} @tab
  1257. The number of seconds the slave thread will sleep before retrying to
  1258. connect to the master in case the master goes down or the connection is
  1259. lost.  Default is 60.  (Example: @code{master-connect-retry=60})
  1260. @item @code{master-info-file=filename} @tab
  1261. The location of the file that remembers where we left off on the master
  1262. during the replication process. The default is master.info in the data
  1263. directory.  Sasha: The only reason I see for ever changing the default
  1264. is the desire to be rebelious.  (Example:
  1265. @code{master-info-file=master.info})
  1266. @item @code{replicate-do-table=db_name.table_name} @tab
  1267. Tells the slave thread to restrict replication to the specified database.
  1268. To specify more than one table, use the directive multiple times,
  1269. once for each table. .
  1270. (Example: @code{replicate-do-table=some_db.some_table})
  1271. @item @code{replicate-ignore-table=db_name.table_name} @tab
  1272. Tells the slave thread to not replicate to the specified table. To
  1273. specify more than one table to ignore, use the directive multiple
  1274. times, once for each table.(Example:
  1275. @code{replicate-ignore-table=db_name.some_table})
  1276. @item @code{replicate-wild-do-table=db_name.table_name} @tab
  1277. Tells the slave thread to restrict replication to the tables that match the
  1278. specified wildcard pattern. .
  1279. To specify more than one table, use the directive multiple times,
  1280. once for each table. .
  1281. (Example: @code{replicate-do-table=foo%.bar%} will replicate only updates
  1282. to tables in all databases that start with foo and whose table names
  1283. start with bar)
  1284. @item @code{replicate-wild-ignore-table=db_name.table_name} @tab
  1285. Tells the slave thread to not replicate to the tables that match the given
  1286. wild card pattern. To
  1287. specify more than one table to ignore, use the directive multiple
  1288. times, once for each table.(Example:
  1289. @code{replicate-ignore-table=foo%.bar%} - will not upates to tables in all databases that start with foo and whose table names
  1290. start with bar)
  1291. @item @code{replicate-ignore-db=database_name} @tab
  1292. Tells the slave thread to not replicate to the specified database. To
  1293. specify more than one database to ignore, use the directive multiple
  1294. times, once for each database. This option will not work if you use cross
  1295. database updates. If you need cross database updates to work, make sure
  1296. you have 3.23.28 or later, and use
  1297. @code{replicate-wild-ignore-table=db_name.%}(Example:
  1298. @code{replicate-ignore-db=some_db})
  1299. @item @code{replicate-do-db=database_name} @tab
  1300. Tells the slave thread to restrict replication to the specified database.
  1301. To specify more than one database, use the directive multiple times,
  1302. once for each database. Note that this will only work if you do not use
  1303. cross-database queries such as @code{UPDATE some_db.some_table SET
  1304. foo='bar'} while having selected a different or no database. If you need
  1305. cross database updates to work, make sure
  1306. you have 3.23.28 or later, and use
  1307. @code{replicate-wild-do-table=db_name.%}
  1308. (Example: @code{replicate-do-db=some_db})
  1309. @item @code{log-slave-updates} @tab
  1310. Tells the slave to log the updates from the slave thread to the binary
  1311. log. Off by default. You will need to turn it on if you plan to
  1312. daisy-chain the slaves.
  1313. @item @code{replicate-rewrite-db=from_name->to_name} @tab
  1314. Updates to a database with a different name than the original (Example:
  1315. @code{replicate-rewrite-db=master_db_name->slave_db_name}
  1316. @item @code{skip-slave-start} @tab
  1317. Tells the slave server not to start the slave on the startup.  The user
  1318. can start it later with @code{SLAVE START}.
  1319. @end multitable
  1320. @cindex SQL commands, replication
  1321. @cindex commands, replication
  1322. @cindex replication, commands
  1323. @node Replication SQL, Replication FAQ, Replication Options, Replication
  1324. @section SQL Commands Related to Replication
  1325. Replication can be controlled through the SQL interface. Below is the
  1326. summary of commands:
  1327. @multitable @columnfractions .30 .70
  1328. @item @strong{Command} @tab @strong{Description}
  1329. @item @code{SLAVE START}
  1330.  @tab Starts the slave thread. (Slave)
  1331. @item @code{SLAVE STOP}
  1332.  @tab Stops the slave thread. (Slave)
  1333. @item @code{SET SQL_LOG_BIN=0}
  1334.  @tab Disables update logging if the user has process privilege.
  1335.  Ignored otherwise. (Master)
  1336. @item @code{SET SQL_LOG_BIN=1}
  1337.  @tab Re-enables update logging if the user has process privilege.
  1338.  Ignored otherwise. (Master)
  1339. @item @code{SET SQL_SLAVE_SKIP_COUNTER=n}
  1340.  @tab Skip the next @code{n} events from the master. Only valid when
  1341. the slave thread is not running, otherwise, gives an error. Useful for
  1342. recovering from replication glitches.
  1343. @item @code{RESET MASTER}
  1344.  @tab Deletes all binary logs listed in the index file, resetting the binlog
  1345. index file to be empty. In pre-3.23.26 versions, @code{FLUSH MASTER} (Master)
  1346. @item @code{RESET SLAVE}
  1347.  @tab Makes the slave forget its replication position in the master
  1348. logs. In pre 3.23.26 versions the command was called
  1349. @code{FLUSH SLAVE}(Slave)
  1350. @item @code{LOAD TABLE tblname FROM MASTER}
  1351.  @tab Downloads a copy of the table from master to the slave. (Slave)
  1352. @item @code{CHANGE MASTER TO master_def_list}
  1353.  @tab Changes the master parameters to the values specified in
  1354. @code{master_def_list} and restarts the slave thread. @code{master_def_list}
  1355. is a comma-separated list of @code{master_def} where @code{master_def} is
  1356. one of the following: @code{MASTER_HOST}, @code{MASTER_USER},
  1357. @code{MASTER_PASSWORD}, @code{MASTER_PORT}, @code{MASTER_CONNECT_RETRY},
  1358. @code{MASTER_LOG_FILE}, @code{MASTER_LOG_POS}. Example:
  1359. @example
  1360. CHANGE MASTER TO
  1361.   MASTER_HOST='master2.mycompany.com',
  1362.   MASTER_USER='replication',
  1363.   MASTER_PASSWORD='bigs3cret',
  1364.   MASTER_PORT=3306,
  1365.   MASTER_LOG_FILE='master2-bin.001',
  1366.   MASTER_LOG_POS=4;
  1367. @end example
  1368. You only need to specify the values that need to be changed. The values that
  1369. you omit will stay the same with the exception of when you change the host or
  1370. the port. In that case, the slave will assume that since you are connecting to
  1371. a different host or a different port, the master is different. Therefore, the
  1372. old values of log and position are not applicable anymore, and will
  1373. automatically be reset to an empty string and 0, respectively (the start
  1374. values). Note that if you restart the slave, it will remember its last master.
  1375. If this is not desirable, you should delete the @file{master.info} file before
  1376. restarting, and the slave will read its master from @code{my.cnf} or the
  1377. command line. (Slave)
  1378. @item @code{SHOW MASTER STATUS} @tab Provides status information on the binlog of the master. (Master)
  1379. @item @code{SHOW SLAVE STATUS} @tab Provides status information on essential parameters of the slave thread. (Slave)
  1380. @item @code{SHOW MASTER LOGS} @tab Only available starting in Version 3.23.28. Lists the binary logs on the master. You should use this command prior to @code{PURGE MASTER LOGS TO} to find out how far you should go.
  1381. @item @code{PURGE MASTER LOGS TO 'logname'}
  1382.  @tab  Available starting in Version 3.23.28. Deletes all the
  1383. replication logs that are listed in the log
  1384. index as being prior to the specified log, and removed them from the
  1385. log index, so that the given log now becomes first. Example:
  1386. @example
  1387. PURGE MASTER LOGS TO 'mysql-bin.010'
  1388. @end example
  1389. This command will do nothing and fail with an error if you have an
  1390. active slave that is currently reading one of the logs you are trying to
  1391. delete. However, if you have a dormant slave, and happen to purge one of
  1392. the logs it wants to read, the slave will be unable to replicate once it
  1393. comes up.  The command is safe to run while slaves are replicating - you
  1394. do not need to stop them.
  1395. You must first check all the slaves with @code{SHOW SLAVE STATUS} to
  1396. see which log they are on, then do a listing of the logs on the
  1397. master with @code{SHOW MASTER LOGS}, find the earliest log among all
  1398. the slaves (if all the slaves are up to date, this will be the
  1399. last log on the list), backup all the logs you are about to delete
  1400. (optional) and purge up to the target log.
  1401. @end multitable
  1402. @node Replication FAQ, Replication Problems, Replication SQL, Replication
  1403. @section Replication FAQ
  1404. @cindex @code{Binlog_Dump}
  1405. @strong{Q}: Why do I sometimes see more than one @code{Binlog_Dump} thread on
  1406. the master after I have restarted the slave?
  1407. @strong{A}: @code{Binlog_Dump} is a continuous process that is handled by the
  1408. server in the following way:
  1409. @itemize @bullet
  1410. @item
  1411. Catch up on the updates.
  1412. @item
  1413. Once there are no more updates left, go into @code{pthread_cond_wait()},
  1414. from which we can be awakened either by an update or a kill.
  1415. @item
  1416. On wake up, check the reason. If we are not supposed to die, continue
  1417. the @code{Binlog_dump} loop.
  1418. @item
  1419. If there is some fatal error, such as detecting a dead client,
  1420. terminate the loop.
  1421. @end itemize
  1422. So if the slave thread stops on the slave, the corresponding
  1423. @code{Binlog_Dump} thread on the master will not notice it until after
  1424. at least one update to the master (or a kill), which is needed to wake
  1425. it up from @code{pthread_cond_wait()}.  In the meantime, the slave
  1426. could have opened another connection, which resulted in another
  1427. @code{Binlog_Dump} thread.
  1428. The above problem should not be present in Version 3.23.26 and later
  1429. versions.  In Version 3.23.26 we added @code{server-id} to each
  1430. replication server, and now all the old zombie threads are killed on the
  1431. master when a new replication thread connects from the same slave
  1432. @strong{Q}: How do I rotate replication logs?
  1433. @strong{A}: In Version 3.23.28 you should use @code{PURGE MASTER LOGS
  1434. TO} command after determining which logs can be deleted, and optionally
  1435. backing them up first. In earlier versions the process is much more
  1436. painful, and cannot be safely done without stopping all the slaves in
  1437. the case that you plan to re-use log names. You will need to stop the
  1438. slave threads, edit the binary log index file, delete all the old logs,
  1439. restart the master, start slave threads,and then remove the old log files.
  1440. @strong{Q}: How do I upgrade on a hot replication setup?
  1441. @strong{A}: If you are upgrading  pre-3.23.26 versions, you should just
  1442. lock the master tables, let the slave catch up, then run @code{FLUSH
  1443. MASTER} on the master, and @code{FLUSH SLAVE} on the slave to reset the
  1444. logs, then restart new versions of the master and the slave. Note that
  1445. the slave can stay down for some time - since the master is logging
  1446. all the updates, the slave will be able to catch up once it is up and
  1447. can connect.
  1448. After 3.23.26, we have locked the replication protocol for modifications, so
  1449. you can upgrade masters and slave on the fly to a newer 3.23 version and you
  1450. can have different versions of @strong{MySQL} running on the slave and the
  1451. master, as long as they are both newer than 3.23.26. 
  1452. @cindex replication, two-way
  1453. @strong{Q}: What issues should I be aware of when setting up two-way
  1454. replication?
  1455. @strong{A}: @strong{MySQL} replication currently does not support any
  1456. locking protocol between master and slave to guarantee the atomicity of
  1457. a distributed (cross-server) update. In in other words, it is possible
  1458. for client A to make an update to  co-master 1, and in the meantime,
  1459. before it propagates to co-master 2, client B could make an update to
  1460. co-master 2 that will make the update of client A work differently than
  1461. it did on co-master 1. Thus when the update of client A will make it
  1462. to co-master 2, it will produce  tables that will be different than
  1463. what you have on co-master 1, even after all the updates from co-master
  1464. 2 have also propagated. So you should not co-chain two servers in a
  1465. two-way replication relationship, unless you are sure that you updates
  1466. can safely happen in any order, or unless you take care of mis-ordered
  1467. updates somehow in the client code.
  1468. You must also realize that two-way replication actually does not improve
  1469. performance very much, if at all, as far as updates are concerned. Both
  1470. servers need to do the same amount of updates each, as you would have
  1471. one server do. The only difference is that there will be a little less
  1472. lock contention, because the updates originating on another server will
  1473. be serialized in one slave thread. This benefit, though, might be
  1474. offset by network delays.
  1475. @cindex performance, improving
  1476. @cindex increasing, performance
  1477. @strong{Q}: How can I use replication to improve performance of my system?
  1478. @strong{A}: You should set up one server as the master, and direct all
  1479. writes to it, and configure as many slaves as you have the money and
  1480. rackspace for, distributing the reads among the master and the slaves.
  1481. You can also start the slaves with @code{--skip-bdb},
  1482. @code{--low-priority-updates} and @code{--delay-key-write-for-all-tables}
  1483. to get speed improvements for the slave.  In this case the slave will
  1484. use non-transactional @code{MyISAM} tables instead of @code{BDB} tables
  1485. to get more speed.
  1486. @strong{Q}: What should I do to prepare my client code to use
  1487. performance-enhancing replication?
  1488. @strong{A}:
  1489. If the part of your code that is responsible for database access has
  1490. been properly abstracted/modularized, converting it to run with the
  1491. replicated setup should be very smooth and easy - just change the
  1492. implementation of your database access to read from some slave or the
  1493. master, and to awlays write to the master. If your code does not have
  1494. this level of abstraction,
  1495. setting up a replicated system will give you an opportunity/motivation
  1496. to it clean up.
  1497.  You should start by creating a wrapper library
  1498. /module with the following functions:
  1499. @itemize
  1500. @item
  1501. @code{safe_writer_connect()}
  1502. @item
  1503. @code{safe_reader_connect()}
  1504. @item
  1505. @code{safe_reader_query()}
  1506. @item
  1507. @code{safe_writer_query()}
  1508. @end itemize
  1509. @code{safe_} means that the function will take care of handling all
  1510. the error conditions.
  1511. You should then convert your client code to use the wrapper library.
  1512. It may be a painful and scary process at first, but it will pay off in
  1513. the long run. All applications that follow the above pattern will be
  1514. able to take advantage of one-master/many slaves solution.  The
  1515. code will be a lot easier to maintain, and adding troubleshooting
  1516. options will be trivial. You will just need to modify one or two
  1517. functions, for example, to log how long each query took, or which
  1518. query, among your many thousands, gave you an error. If you have written a lot of code already,
  1519. you may want to automate the conversion task by using Monty's
  1520. @code{replace} utility, which comes with the standard distribution of
  1521. @strong{MySQL}, or just write your own Perl script. Hopefully, your
  1522. code follows some recognizable pattern. If not, then you are probably
  1523. better off re-writing it anyway, or at least going through and manually
  1524. beating it into a pattern.
  1525. Note that, of course, you can use different names for the
  1526. functions. What is important is having unified interface for connecting
  1527. for reads, connecting for writes, doing a read, and doing a write.
  1528. @strong{Q}: When and how much can @strong{MySQL} replication improve the performance
  1529. of my system?
  1530. @strong{A}: @strong{MySQL} replication is most beneficial for a system
  1531. with frequent reads and not so frequent writes. In theory, by using a
  1532. one master/many slaves setup you can scale by adding more slaves until
  1533. you either run out of network bandwidth, or your update
  1534. load grows to the point
  1535. that the master cannot handle it.
  1536. In order to determine how many slaves you can get before the added
  1537. benefits begin to level out, and how much you can improve performance
  1538. of your site, you need to know your query patterns, and empirically
  1539.  (by benchmarking) determine the relationship between the throughput
  1540. on reads (reads per second, or @code{max_reads}) and on writes
  1541. @code{max_writes}) on a typical master and a typical slave. The
  1542. example below will show you a rather simplified calculation of what you
  1543. can get with replication for our imagined system.
  1544. Let's say our system load consists of 10% writes and 90% reads, and we
  1545. have determined that @code{max_reads} = 1200 - 2 * @code{max_writes},
  1546. or in other words, our system can do 1200 reads per second with no
  1547. writes, our average write is twice as slow as average read,
  1548. and the relationship is
  1549. linear. Let us suppose that our master and slave are of the same
  1550. capacity, and we have N slaves and 1 master. Then we have for each
  1551. server (master or slave):
  1552. @code{reads = 1200 - 2 * writes} (from bencmarks)
  1553. @code{reads = 9* writes / (N + 1) } (reads split, but writes go
  1554. to all servers)
  1555. @code{9*writes/(N+1) + 2 * writes = 1200}
  1556. @code{writes = 1200/(2 + 9/(N+1)}
  1557. So if N = 0, which means we have no replication, our system can handle
  1558. 1200/11, about 109 writes per second (which means we will have 9 times
  1559. as many reads due to the nature of our application).
  1560. If N = 1, we can get up to 184 writes per second.
  1561. If N = 8, we get up to 400.
  1562. If N = 17, 480 writes.
  1563. Eventually as N approaches infinity (and our budget negative infinity),
  1564. we can get very close to 600 writes per second, increasing system
  1565. throughput about 5.5 times. However, with only 8 servers, we increased
  1566. it almost 4 times already.
  1567. Note that our computations assumed infinite network bandwidth, and
  1568. neglected several other factors that could turn out to be signficant on
  1569. your system. In many cases, you may not be able to make a computation
  1570. similar to the one above that will accurately predict what will happen
  1571. on your system if you add N replication slaves. However, answering the
  1572. following questions should help you decided whether and how much, if at
  1573. all, the replication will improve the performance of your system:
  1574. @itemize @bullet
  1575. @item
  1576. What is the read/write ratio on your system?
  1577. @item
  1578. How much more write load can one server handle if you reduce the reads?
  1579. @item
  1580. How many slaves do you have bandwidth for on your network?
  1581. @end itemize
  1582. @strong{Q}: How can I use replication to provide redundancy/high
  1583. availability?
  1584. @strong{A}: With the currently available features, you would have to
  1585. set up a master and a slave (or several slaves), and write a script
  1586. that will monitor the
  1587. master to see if it is up, and instruct your applications and
  1588. the slaves of the master change in case of failure. Some suggestions:
  1589. @itemize @bullet
  1590. @item
  1591. To tell a slave to change the master use the @code{CHANGE MASTER TO} command.
  1592. @item
  1593. A good way to keep your applications informed where the master is by
  1594. having a dynamic DNS entry for the master. With @strong{bind} you can
  1595. use @code{nsupdate} to dynamically update your DNS.
  1596. @item
  1597. You should run your slaves with the @code{log-bin} option and without
  1598. @code{log-slave-updates}. This way the slave will be ready to become a
  1599. master as soon as you issue @code{STOP SLAVE}; @code{RESET MASTER}, and
  1600. @code{CHANGE MASTER TO} on the other slaves. It will also help you catch
  1601. spurious updates that may happen because of misconfiguration of the
  1602. slave (ideally, you want to configure access rights so that no client
  1603. can update the slave, except for the slave thread) combined with the
  1604. bugs in your client programs (they should never update the slave
  1605. directly).
  1606. @end itemize
  1607. We are currently working on intergrating an automatic master election
  1608. system into @strong{MySQL}, but until it is ready, you will have to
  1609. create your own monitoring tools.
  1610. @node Replication Problems,  , Replication FAQ, Replication
  1611. @section Troubleshooting Replication
  1612. If you have followed the instructions, and your replication setup is not
  1613. working, first elliminate the user error factor by checking the following:
  1614. @itemize @bullet
  1615. @item
  1616. Is the master logging to the binary log? Check with @code{SHOW MASTER STATUS}.
  1617. If it is, @code{Position} will be non-zero. If not, verify that you have
  1618. given the master @code{log-bin} option and have set @code{server-id}.
  1619. @item
  1620. Is the slave running? Check with @code{SHOW SLAVE STATUS}. The answer is found
  1621. in @code{Slave_running} column. If not, verify slave options and check the
  1622. error log for messages.
  1623. @item
  1624. If the slave is running, did it establish connection with the master? Do
  1625. @code{SHOW PROCESSLIST}, find the thread with @code{system user} value in
  1626. @code{User} column and @code{none} in the @code{Host} column, and check the
  1627. @code{State} column. If it says @code{connecting to master}, verify the
  1628. privileges for the replication user on the master, master host name, your
  1629. DNS setup, whether the master is actually running, whether it is reachable
  1630. from the slave, and if all that seems ok, read the error logs.
  1631. @item
  1632. If the slave was running, but then stopped, look at SHOW SLAVE STATUS
  1633. output andcheck the error logs. It usually
  1634. happens when some query that succeeded on the master fails on the slave. This
  1635. should never happen if you have taken a proper snapshot of the master, and
  1636. never modify the data on the slave outside of the slave thread. If it does,
  1637. it is a bug, read below on how to report it.
  1638. @item
  1639. If a query on that succeeded on the master refuses to run on the slave, and
  1640. a full database resync ( the proper thing to do ) does not seem feasible,
  1641. try the following:
  1642. @itemize bullet
  1643. @item
  1644. First see if there is some stray record in the way. Understand how it got
  1645. there, then delete it and run @code{SLAVE START}
  1646. @item
  1647. If the above does not work or does not apply, try to understand if it would
  1648. be safe to make the update manually ( if needed) and then ignore the next
  1649. query from the master.
  1650. @item
  1651. If you have decided you can skip the next query, do
  1652. @code{SET SQL_SLAVE_SKIP_COUNTER=1; SLAVE START;} to skip a query that
  1653. does not use auto_increment, last_insert_id or timestamp, or
  1654. @code{SET SQL_SLAVE_SKIP_COUNTER=2; SLAVE START;} otherwise
  1655. @item
  1656. If you are sure the slave started out perfectly in sync with the master,
  1657. and no one has updated  the tables involved outside of slave thread,
  1658. report the bug, so
  1659. you will not have to do the above tricks again.
  1660. @end itemize
  1661. @item
  1662. Make sure you are not running into an old bug by upgrading to the most recent
  1663. version.
  1664. @item
  1665. If all else fails, read the error logs. If they are big,
  1666. @code{grep -i slave /path/to/your-log.err} on the slave. There is no
  1667. generic pattern to search for on the master, as the only errors it logs
  1668. are general system errors - if it can, it will send the error to the slave
  1669. when things go wrong.
  1670. @end itemize
  1671. When you have determined that there is no user error involved, and replication
  1672. still either does not work at all or is unstable, it is time to start working
  1673. on a bug report. We need to get as much info as possible from you to be able
  1674. to track down the bug. Please do spend some time and effort preparing a good
  1675. bug report. Ideally, we would like to have a test case in the format found in
  1676. @code{mysql-test/t/rpl*} directory of the source tree. If you submit a test
  1677. case like that, you can expect a patch within a day or two in most cases,
  1678. although, of course, you mileage may vary depending on a number of factors.
  1679. Second best option is a just program with easily configurable connection
  1680. arguments for the master and the slave that will demonstrate the problem on our
  1681. systems. You can write one in Perl or in C, depending on which language you
  1682. know better.
  1683. If you have one of the above ways to demonstrate the bug, use
  1684. @code{mysqlbug} to prepare a bug report and send it to
  1685. @email{bugs@@lists.mysql.com}. If you have a phantom - a problem that
  1686. does occur but you cannot duplicate "at will":
  1687. @itemize @bullet
  1688. @item
  1689. Verify that there is no user error involved. For example, if you update the
  1690. slave outside of the slave thread, the data will be out of sync, and you can
  1691. have unique key violations on updates, in which case the slave thread will
  1692. stop and wait for you to clean up the tables manually to bring them in sync.
  1693. @item
  1694. Run slave with @code{log-slave-updates} and @code{log-bin} - this will keep
  1695. a log of all updates on the slave.
  1696. @item
  1697. Save all evidence before reseting the replication. If we have no or only
  1698. sketchy information, it would take us a while to track down the problem. The
  1699. evidence you should collect is:
  1700. @itemize @bullet
  1701. @item
  1702. All binary logs on the master
  1703. @item
  1704. All binary log on the slave
  1705. @item
  1706. The output of @code{SHOW MASTER STATUS} on the master at the time
  1707. you have discovered the problem
  1708. @item
  1709. The output of @code{SHOW SLAVE STATUS} on the master at the time
  1710. you have discovered the problem
  1711. @item
  1712. Error logs on the master and on the slave
  1713. @end itemize
  1714. @item
  1715. Use @code{mysqlbinlog} to examine the binary logs. The following should
  1716. be helpful
  1717. to find the trouble query, for example:
  1718. @example
  1719. mysqlbinlog -j pos_from_slave_status /path/to/log_from_slave_status | head
  1720. @end example
  1721. @end itemize
  1722. Once you have collected the evidence on the phantom problem, try hard to
  1723. isolate it into a separate test case first. Then report the problem to
  1724. @email{bugs@@lists.mysql.com} with as much info as possible.
  1725. @cindex performance, maximizing
  1726. @cindex optimization
  1727. @node Performance, MySQL Benchmarks, Replication, Top
  1728. @chapter Getting Maximum Performance from MySQL
  1729. Optimization is a complicated task because it ultimately requires
  1730. understanding of the whole system. While it may be possible to do some
  1731. local optimizations with small knowledge of your system/application, the
  1732. more optimal you want your system to become the more you will have to
  1733. know about it.
  1734. So this chapter will try to explain and give some examples of different
  1735. ways to optimize @strong{MySQL}. But remember that there are always some
  1736. (increasingly harder) additional ways to make the system even faster.
  1737. @menu
  1738. * Optimize Basics::             Optimization overview
  1739. * System::                      System/Compile time and startup parameter tuning
  1740. * Data size::                   Get your data as small as possible
  1741. * MySQL indexes::               How @strong{MySQL} uses indexes
  1742. * Query Speed::                 Speed of queries that access or update data
  1743. * Tips::                        Other optimization tips
  1744. * Benchmarks::                  Using your own benchmarks
  1745. * Design::                      Design choices
  1746. * Design Limitations::          MySQL design limitations/tradeoffs
  1747. * Portability::                 Portability
  1748. * Internal use::                What have we used MySQL for?
  1749. @end menu
  1750. @node Optimize Basics, System, Performance, Performance
  1751. @section Optimization Overview
  1752. The most important part for getting a system fast is of course the basic
  1753. design. You also need to know what kinds of things your system will be
  1754. doing, and what your bottlenecks are.
  1755. The most common bottlenecks are:
  1756. @itemize @bullet
  1757. @item Disk seeks.
  1758. It takes time for the disk to find a piece of data. With modern disks in
  1759. 1999, the mean time for this is usually lower than 10ms, so we can in
  1760. theory do about 1000 seeks a second. This time improves slowly with new
  1761. disks and is very hard to optimize for a single table. The way to
  1762. optimize this is to spread the data on more than one disk.
  1763. @item Disk reading/writing.
  1764. When the disk is at the correct position we need to read the data. With
  1765. modern disks in 1999, one disk delivers something like 10-20Mb/s. This
  1766. is easier to optimize than seeks because you can read in parallel from
  1767. multiple disks.
  1768. @item CPU cycles.
  1769. When we have the data in main memory (or if it already were
  1770. there) we need to process it to get to our result. Having small
  1771. tables compared to the memory is the most common limiting
  1772. factor. But then, with small tables speed is usually not the problem.
  1773. @item Memory bandwidth.
  1774. When the CPU needs more data than can fit in the CPU cache the main
  1775. memory bandwidth becomes a bottleneck. This is an uncommon bottleneck
  1776. for most systems, but one should be aware of it.
  1777. @end itemize
  1778. @cindex compiling, optimizing
  1779. @cindex system optimization
  1780. @cindex startup parameters, tuning
  1781. @node System, Data size, Optimize Basics, Performance
  1782. @section System/Compile Time and Startup Parameter Tuning
  1783. We start with the system level things since some of these decisions have
  1784. to be made very early. In other cases a fast look at this part may
  1785. suffice because it not that important for the big gains. However, it is always
  1786. nice to have a feeling about how much one could gain by changing things
  1787. at this level.
  1788. The default OS to use is really important!  To get the most use of
  1789. multiple CPU machines one should use Solaris (because the threads works
  1790. really nice) or Linux (because the 2.2 kernel has really good SMP
  1791. support). Also on 32-bit machines Linux has a 2G file size limit by
  1792. default. Hopefully this will be fixed soon when new filesystems are
  1793. released (XFS/Reiserfs).  If you have a desperate need for files bigger
  1794. than 2G on Linux-intel 32 bit, you should get the LFS patch for the ext2
  1795. file system.
  1796. Because we have not run @strong{MySQL} in production on that many platforms, we
  1797. advice you to test your intended platform before choosing it, if possible.
  1798. @cindex locking
  1799. Other tips:
  1800. @itemize @bullet
  1801. @item
  1802. If you have enough RAM, you could remove all swap devices. Some
  1803. operating systems will use a swap device in some contexts even if you
  1804. have free memory.
  1805. @item
  1806. Use the @code{--skip-locking} @strong{MySQL} option to avoid external
  1807. locking. Note that this will not impact @strong{MySQL}'s functionality as
  1808. long as you only run one server. Just remember to take down the server (or
  1809. lock relevant parts) before you run @code{myisamchk}. On some system
  1810. this switch is mandatory because the external locking does not work in any
  1811. case.
  1812. The @code{--skip-locking} option is on by default when compiling with
  1813. MIT-pthreads, because @code{flock()} isn't fully supported by
  1814. MIT-pthreads on all platforms.  It's also on default for Linux
  1815. as Linux file locking are not yet safe.
  1816. The only case when you can't use @code{--skip-locking} is if you run
  1817. multiple @strong{MySQL} @emph{servers} (not clients) on the same data,
  1818. or run @code{myisamchk} on the table without first flushing and locking
  1819. the @code{mysqld} server tables first.
  1820. You can still use @code{LOCK TABLES}/@code{UNLOCK TABLES} even if you
  1821. are using @code{--skip-locking}
  1822. @end itemize
  1823. @menu
  1824. * Compile and link options::    How compiling and linking affects the speed of MySQL
  1825. * Disk issues::                 Disk issues
  1826. * Server parameters::           Tuning server parameters
  1827. * Table cache::                 How MySQL opens and closes tables
  1828. * Creating many tables::        Drawbacks of creating large numbers of tables in the same database
  1829. * Open tables::                 Why so many open tables?
  1830. * Memory use::                  How MySQL uses memory
  1831. * Internal locking::            How MySQL locks tables
  1832. * Table locking::               Table locking issues
  1833. * DNS::                         
  1834. @end menu
  1835. @node Compile and link options, Disk issues, System, System
  1836. @subsection How Compiling and Linking Affects the Speed of MySQL
  1837. Most of the following tests are done on Linux with the
  1838. @strong{MySQL} benchmarks, but they should give some indication for
  1839. other operating systems and workloads.
  1840. @cindex linking, speed
  1841. @cindex compiling, speed
  1842. @cindex speed, compiling
  1843. @cindex speed, linking
  1844. You get the fastest executable when you link with @code{-static}.
  1845. On Linux, you will get the fastest code when compiling with @code{pgcc}
  1846. and @code{-O6}. To compile @file{sql_yacc.cc} with these options, you
  1847. need about 200M memory because @code{gcc/pgcc} needs a lot of memory to
  1848. make all functions inline. You should also set @code{CXX=gcc} when
  1849. configuring @strong{MySQL} to avoid inclusion of the @code{libstdc++}
  1850. library (it is not needed). Note that with some versions of @code{pgcc},
  1851. the resulting code will only run on true Pentium processors, even if you
  1852. use the compiler option that you want the resulting code to be working on
  1853. all x586 type processors (like AMD).
  1854. By just using a better compiler and/or better compiler options you can
  1855. get a 10-30 % speed increase in your application.  This is particularly
  1856. important if you compile the SQL server yourself!
  1857. We have tested both the Cygnus CodeFusion and Fujitsu compilers, but
  1858. when we tested them, neither was sufficiently bug free to allow
  1859. @strong{MySQL} to be compiled with optimizations on.
  1860. When you compile @strong{MySQL} you should only include support for the
  1861. character sets that you are going to use. (Option @code{--with-charset=xxx}).
  1862. The standard @strong{MySQL} binary distributions are compiled with support
  1863. for all character sets.
  1864. Here is a list of some mesurements that we have done:
  1865. @itemize @bullet
  1866. @item
  1867. If you use @code{pgcc} and compile everything with @code{-O6}, the
  1868. @code{mysqld} server is 1% faster than with @code{gcc} 2.95.2.
  1869. @item
  1870. If you link dynamically (without @code{-static}), the result is 13%
  1871. slower on Linux.  Note that you still can use a dynamic linked
  1872. @strong{MySQL} library. It is only the server that is critical for
  1873. performance.
  1874. @item
  1875. If you connect using TCP/IP rather than Unix sockets, the result is 7.5%
  1876. slower on the same computer. (If you are connection to @code{localhost},
  1877. @strong{MySQL} will, by default, use sockets).
  1878. @item
  1879. If you compile with @code{--with-debug=full}, then you will loose 20 %
  1880. for most queries, but some queries may take substantially longer (The
  1881. @strong{MySQL} benchmarks ran 35 % slower)
  1882. If you use @code{--with-debug}, then you will only loose 15 %.
  1883. @item
  1884. On a Sun SPARCstation 20, SunPro C++ 4.2 is 5 % faster than @code{gcc} 2.95.2.
  1885. @item
  1886. Compiling with @code{gcc} 2.95.2 for ultrasparc with the option
  1887. @code{-mcpu=v8 -Wa,-xarch=v8plusa} gives 4 % more performance.
  1888. @item
  1889. On Solaris 2.5.1, MIT-pthreads is 8-12% slower than Solaris native
  1890. threads on a single processor. With more load/CPUs the difference should
  1891. get bigger.
  1892. @item
  1893. Running with @code{--log-bin} makes @strong{[MySQL} 1 % slower.
  1894. @item
  1895. Compiling without frame pointers @code{-fomit-frame-pointer} with gcc makes
  1896. MySQL 1 % faster.
  1897. @end itemize
  1898. The @strong{MySQL}-Linux distribution provided by MySQL AB used to be
  1899. compiled with @code{pgcc}, but we had to go back to regular gcc because
  1900. of a bug in @code{pgcc} that would generate the code that does not run
  1901. on AMD. We will continue using gcc until that bug is resolved.  In the
  1902. meantime, if you have a non-AMD machine, you can get a faster binary by
  1903. compiling with @code{pgcc}.  The standard MySqL Linux binary is linked
  1904. statically to get it faster and more portable.
  1905. @cindex disk issues
  1906. @cindex performance, disk issues
  1907. @node Disk issues, Server parameters, Compile and link options, System
  1908. @subsection Disk Issues
  1909. @itemize @bullet
  1910. @item
  1911. As mentioned before, disks seeks are a big performance bottleneck. This
  1912. problems gets more and more apparent when the data starts to grow so
  1913. large that effective caching becomes impossible. For large databases,
  1914. where you access data more or less randomly, you can be sure that you
  1915. will need at least one disk seek to read and a couple of disk seeks to
  1916. write things. To minimize this problem, use disks with low seek times.
  1917. @item
  1918. Increase the number of available disk spindles (and thereby reduce
  1919. the seek overhead) by either symlink files to different disks or striping
  1920. the disks.
  1921. @table @strong
  1922. @item Using symbolic links
  1923. This means that you symlink the index and/or data file(s) from the
  1924. normal data directory to another disk (that may also be striped). This
  1925. makes both the seek and read times better (if the disks are not used for
  1926. other things). @xref{Symbolic links}.
  1927. @cindex striping, defined
  1928. @item Striping
  1929. Striping means that you have many disks and put the first block on the
  1930. first disk, the second block on the second disk, and the Nth on the
  1931. (N mod number_of_disks) disk, and so on. This means if your normal data
  1932. size is less than the stripe size (or perfectly aligned) you will get
  1933. much better performance. Note that striping is very dependent on the OS
  1934. and stripe-size. So benchmark your application with different
  1935. stripe-sizes. @xref{Benchmarks}.
  1936. Note that the speed difference for striping is @strong{very} dependent
  1937. on the parameters. Depending on how you set the striping parameters and
  1938. number of disks you may get a difference in orders of magnitude. Note that
  1939. you have to choose to optimize for random or sequential access.
  1940. @end table
  1941. @item
  1942. For reliability you may want to use RAID 0+1 (striping + mirroring), but
  1943. in this case you will need 2*N drives to hold N drives of data. This is
  1944. probably the best option if you have the money for it!  You may, however,
  1945. also have to invest in some volume-management software to handle it
  1946. efficiently.
  1947. @item
  1948. A good option is to have semi-important data (that can be regenerated)
  1949. on RAID 0 disk while storing really important data (like host information
  1950. and logs) on a RAID 0+1 or RAID N disk. RAID N can be a problem if you
  1951. have many writes because of the time to update the parity bits.
  1952. @item
  1953. You may also set the parameters for the file system that the database
  1954. uses. One easy change is to mount the file system with the noatime
  1955. option. That makes it skip the updating of the last access time in the
  1956. inode and by this will avoid some disk seeks.
  1957. @item
  1958. On Linux, you can get much more performance (up to 100 % under load is
  1959. not uncommon) by using hdpram to configure your disk's interface!  The
  1960. following should be quite good hdparm options for @strong{MySQL} (and
  1961. probably many other applications):
  1962. @example
  1963. hdparm -m 16 -d 1
  1964. @end example
  1965. Note that the performance/reliability when using the above depends on
  1966. your hardware, so we strongly suggest that you test your system
  1967. throughly after using @code{hdparm}!  Please consult the @code{hdparm}
  1968. man page for more information!  If @code{hdparm} is not used wisely,
  1969. filesystem corruption may result.  Backup everything before experimenting!
  1970. @item
  1971. On many operating systems you can mount the disks with the 'async' flag to set the file
  1972. system to be updated asynchronously.  If your computer is reasonable stable,
  1973. this should give you more performance without sacrificing too much reliability.
  1974. (This flag is on by default on Linux.)
  1975. @item
  1976. If you don't need to know when a file was last accessed (which is not
  1977. really useful on a databasa server), you can mount your file systems
  1978. with the noatime flag.
  1979. @end itemize
  1980. @menu
  1981. * Symbolic links::              Using symbolic links for databases and tables
  1982. @end menu
  1983. @cindex symbolic links
  1984. @cindex links, symbolic
  1985. @cindex databases, symbolic links
  1986. @cindex tables, symbolic links
  1987. @node Symbolic links,  , Disk issues, Disk issues
  1988. @subsubsection Using Symbolic Links for Databases and Tables
  1989. You can move tables and databases from the database directory to other
  1990. locations and replace them with symbolic links to the new locations.
  1991. You might want to do this, for example, to move a database to a file
  1992. system with more free space.
  1993. If @strong{MySQL} notices that a table is symbolically linked, it will
  1994. resolve the symlink and use the table it points to instead. This works
  1995. on all systems that support the @code{realpath()} call (at least Linux
  1996. and Solaris support @code{realpath()})!  On systems that don't support
  1997. @code{realpath()}, you should not access the table through the real path
  1998. and through the symlink at the same time!  If you do, the table will be
  1999. inconsistent after any update.
  2000. @strong{MySQL} doesn't that you link one directory to multiple
  2001. databases.  Replacing a database directory with a symbolic link will
  2002. work fine as long as you don't make a symbolic link between databases.
  2003. Suppose you have a database @code{db1} under the @strong{MySQL} data
  2004. directory, and then make a symlink @code{db2} that points to @code{db1}:
  2005. @example
  2006. shell> cd /path/to/datadir
  2007. shell> ln -s db1 db2
  2008. @end example
  2009. Now, for any table @code{tbl_a} in @code{db1}, there also appears to be
  2010. a table @code{tbl_a} in @code{db2}.  If one thread updates @code{db1.tbl_a}
  2011. and another thread updates @code{db2.tbl_a}, there will be problems.
  2012. If you really need this, you must change the following code in
  2013. @file{mysys/mf_format.c}:
  2014. @example
  2015. if (flag & 32 || (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
  2016. @end example
  2017. to
  2018. @example
  2019. if (1)
  2020. @end example
  2021. On Windows you can use internal symbolic links to directories by compiling
  2022. @strong{MySQL} with @code{-DUSE_SYMDIR}. This allows you to put different
  2023. databases on different disks. @xref{Windows symbolic links}.
  2024. @cindex parameters, server
  2025. @cindex @code{mysqld} server, buffer sizes
  2026. @cindex buffer sizes, @code{mysqld} server
  2027. @cindex startup parameters
  2028. @node Server parameters, Table cache, Disk issues, System
  2029. @subsection Tuning Server Parameters
  2030. You can get the default buffer sizes used by the @code{mysqld} server
  2031. with this command:
  2032. @example
  2033. shell> mysqld --help
  2034. @end example
  2035. @cindex @code{mysqld} options
  2036. @cindex variables, @code{mysqld}
  2037. This command produces a list of all @code{mysqld} options and configurable
  2038. variables. The output includes the default values and looks something
  2039. like this:
  2040. @example
  2041. Possible variables for option --set-variable (-O) are:
  2042. back_log              current value: 5
  2043. bdb_cache_size        current value: 1048540
  2044. binlog_cache_size     current_value: 32768
  2045. connect_timeout       current value: 5
  2046. delayed_insert_timeout  current value: 300
  2047. delayed_insert_limit  current value: 100
  2048. delayed_queue_size    current value: 1000
  2049. flush_time            current value: 0
  2050. interactive_timeout   current value: 28800
  2051. join_buffer_size      current value: 131072
  2052. key_buffer_size       current value: 1048540
  2053. lower_case_table_names  current value: 0
  2054. long_query_time       current value: 10
  2055. max_allowed_packet    current value: 1048576
  2056. max_binlog_cache_size current_value: 4294967295
  2057. max_connections       current value: 100
  2058. max_connect_errors    current value: 10
  2059. max_delayed_threads   current value: 20
  2060. max_heap_table_size   current value: 16777216
  2061. max_join_size         current value: 4294967295
  2062. max_sort_length       current value: 1024
  2063. max_tmp_tables        current value: 32
  2064. max_write_lock_count  current value: 4294967295
  2065. myisam_sort_buffer_size  current value: 8388608
  2066. net_buffer_length     current value: 16384
  2067. net_retry_count       current value: 10
  2068. net_read_timeout      current value: 30
  2069. net_write_timeout     current value: 60
  2070. query_buffer_size     current value: 0
  2071. record_buffer         current value: 131072
  2072. slow_launch_time      current value: 2
  2073. sort_buffer           current value: 2097116
  2074. table_cache           current value: 64
  2075. thread_concurrency    current value: 10
  2076. tmp_table_size        current value: 1048576
  2077. thread_stack          current value: 131072
  2078. wait_timeout          current value: 28800
  2079. @end example
  2080. If there is a @code{mysqld} server currently running, you can see what
  2081. values it actually is using for the variables by executing this command:
  2082. @example
  2083. shell> mysqladmin variables
  2084. @end example
  2085. You can find a full description for all variables in the @code{SHOW VARIABLES}
  2086. section in this manual. @xref{SHOW VARIABLES}.
  2087. You can also see some statistics from a running server by issuing the command
  2088. @code{SHOW STATUS}. @xref{SHOW STATUS}.
  2089. @strong{MySQL} uses algorithms that are very scalable, so you can usually
  2090. run with very little memory. If you, however, give @strong{MySQL} more
  2091. memory, you will normally also get better performance.
  2092. When tuning a @strong{MySQL} server, the two most important variables to use
  2093. are @code{key_buffer_size} and @code{table_cache}.  You should first feel
  2094. confident that you have these right before trying to change any of the
  2095. other variables.
  2096. If you have much memory (>=256M) and many tables and want maximum performance
  2097. with a moderate number of clients, you should use something like this:
  2098. @example
  2099. shell> safe_mysqld -O key_buffer=64M -O table_cache=256 
  2100.            -O sort_buffer=4M -O record_buffer=1M &
  2101. @end example
  2102. If you have only 128M and only a few tables, but you still do a lot of
  2103. sorting, you can use something like:
  2104. @example
  2105. shell> safe_mysqld -O key_buffer=16M -O sort_buffer=1M
  2106. @end example
  2107. If you have little memory and lots of connections, use something like this:
  2108. @example
  2109. shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k 
  2110.            -O record_buffer=100k &
  2111. @end example
  2112. or even:
  2113. @example
  2114. shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k 
  2115.            -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &
  2116. @end example
  2117. When you have installed @strong{MySQL}, the @file{support-files} directory will
  2118. contain some different @code{my.cnf} example files, @file{my-huge.cnf},
  2119. @file{my-large.cnf}, @file{my-medium.cnf}, and @file{my-small.cnf}, you can
  2120. use as a base to optimize your system.
  2121. If there are very many connections, ``swapping problems'' may occur unless
  2122. @code{mysqld} has been configured to use very little memory for each
  2123. connection. @code{mysqld} performs better if you have enough memory for all
  2124. connections, of course.
  2125. Note that if you change an option to @code{mysqld}, it remains in effect only
  2126. for that instance of the server.
  2127. To see the effects of a parameter change, do something like this:
  2128. @example
  2129. shell> mysqld -O key_buffer=32m --help
  2130. @end example
  2131. Make sure that the @code{--help} option is last; otherwise, the effect of any
  2132. options listed after it on the command line will not be reflected in the
  2133. output.
  2134. @cindex tables, opening
  2135. @cindex tables, closing
  2136. @cindex opening, tables
  2137. @cindex closing, tables
  2138. @cindex table cache
  2139. @findex table_cache
  2140. @node Table cache, Creating many tables, Server parameters, System
  2141. @subsection How MySQL Opens and Closes Tables
  2142. @code{table_cache}, @code{max_connections}, and @code{max_tmp_tables}
  2143. affect the maximum number of files the server keeps open.  If you
  2144. increase one or both of these values, you may run up against a limit
  2145. imposed by your operating system on the per-process number of open file
  2146. descriptors.  However, you can increase the limit on many systems.
  2147. Consult your OS documentation to find out how to do this, because the
  2148. method for changing the limit varies widely from system to system.
  2149. @code{table_cache} is related to @code{max_connections}.  For example,
  2150. for 200 concurrent running connections, you should have a table cache of
  2151. at least @code{200 * n}, where @code{n} is the maximum number of tables
  2152. in a join.
  2153. The cache of open tables can grow to a maximum of @code{table_cache}
  2154. (default 64; this can be changed with the @code{-O table_cache=#}
  2155. option to @code{mysqld}).  A table is never closed, except when the
  2156. cache is full and another thread tries to open a table or if you use
  2157. @code{mysqladmin refresh} or @code{mysqladmin flush-tables}.
  2158. When the table cache fills up, the server uses the following procedure
  2159. to locate a cache entry to use:
  2160. @itemize @bullet
  2161. @item
  2162. Tables that are not currently in use are released, in least-recently-used
  2163. order.
  2164. @item
  2165. If the cache is full and no tables can be released, but a new table needs to
  2166. be opened, the cache is temporarily extended as necessary.
  2167. @item
  2168. If the cache is in a temporarily-extended state and a table goes from in-use
  2169. to not-in-use state, the table is closed and released from the cache.
  2170. @end itemize
  2171. A table is opened for each concurrent access. This means that
  2172. if you have two threads accessing the same table or access the table
  2173. twice in the same query (with @code{AS}) the table needs to be opened twice.
  2174. The first open of any table takes two file descriptors; each additional
  2175. use of the table takes only one file descriptor.  The extra descriptor
  2176. for the first open is used for the index file; this descriptor is shared
  2177. among all threads.
  2178. You can check if your table cache is too small by checking the mysqld
  2179. variable @code{opened_tables}.  If this is quite big, even if you
  2180. haven't done a lot of @code{FLUSH TABLES}, you should increase your table
  2181. cache. @xref{SHOW STATUS}.
  2182. @cindex tables, too many
  2183. @node Creating many tables, Open tables, Table cache, System
  2184. @subsection Drawbacks to Creating Large Numbers of Tables in the Same Database
  2185. If you have many files in a directory, open, close, and create operations will
  2186. be slow.  If you execute @code{SELECT} statements on many different tables,
  2187. there will be a little overhead when the table cache is full, because for
  2188. every table that has to be opened, another must be closed. You can reduce
  2189. this overhead by making the table cache larger.
  2190. @cindex tables, open
  2191. @cindex open tables
  2192. @node Open tables, Memory use, Creating many tables, System
  2193. @subsection Why So Many Open tables?
  2194. When you run @code{mysqladmin status}, you'll see something like this:
  2195. @example
  2196. Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12
  2197. @end example
  2198. This can be somewhat perplexing if you only have 6 tables.
  2199. @strong{MySQL} is multithreaded, so it may have many queries on the same
  2200. table simultaneously. To minimize the problem with two threads having
  2201. different states on the same file, the table is opened independently by
  2202. each concurrent thread. This takes some memory and one extra file
  2203. descriptor for the data file. The index file descriptor is shared
  2204. between all threads.
  2205. @cindex memory use
  2206. @node Memory use, Internal locking, Open tables, System
  2207. @subsection How MySQL Uses Memory
  2208. The list below indicates some of the ways that the @code{mysqld} server
  2209. uses memory.  Where applicable, the name of the server variable relevant
  2210. to the memory use is given:
  2211. @itemize @bullet
  2212. @item
  2213. The key buffer (variable @code{key_buffer_size}) is shared by all
  2214. threads; Other buffers used by the server are allocated as
  2215. needed. @xref{Server parameters}.
  2216. @item
  2217. Each connection uses some thread-specific space: A stack (default 64K,
  2218. variable @code{thread_stack}), a connection buffer (variable
  2219. @code{net_buffer_length}), and a result buffer (variable
  2220. @code{net_buffer_length}). The connection buffer and result buffer are
  2221. dynamically enlarged up to @code{max_allowed_packet} when needed.  When
  2222. a query is running, a copy of the current query string is also allocated.
  2223. @item
  2224. All threads share the same base memory.
  2225. @item
  2226. Only the compressed ISAM / MyISAM tables are memory mapped.  This is
  2227. because the 32-bit memory space of 4GB is not large enough for most
  2228. big tables. When systems with a 64-bit address space become more
  2229. common we may add general support for memory mapping.
  2230. @item
  2231. Each request doing a sequential scan over a table allocates a read buffer
  2232. (variable @code{record_buffer}).
  2233. @item
  2234. All joins are done in one pass, and most joins can be done without even
  2235. using a temporary table. Most temporary tables are memory-based (HEAP)
  2236. tables.  Temporary tables with a big record length (calculated as the
  2237. sum of all column lengths) or that contain @code{BLOB} columns are
  2238. stored on disk.
  2239. One problem in @strong{MySQL} versions before Version 3.23.2 is that if a HEAP table
  2240. exceeds the size of @code{tmp_table_size}, you get the error @code{The
  2241. table tbl_name is full}. In newer versions this is handled by
  2242. automatically changing the in-memory (HEAP) table to a disk-based
  2243. (MyISAM) table as necessary. To work around this problem, you can
  2244. increase the temporary table size by setting the @code{tmp_table_size}
  2245. option to @code{mysqld}, or by setting the SQL option
  2246. @code{SQL_BIG_TABLES} in the client program.  @xref{SET OPTION, ,
  2247. @code{SET OPTION}}. In @strong{MySQL} Version 3.20, the maximum size of the
  2248. temporary table was @code{record_buffer*16}, so if you are using this
  2249. version, you have to increase the value of @code{record_buffer}. You can
  2250. also start @code{mysqld} with the @code{--big-tables} option to always
  2251. store temporary tables on disk. However, this will affect the speed of
  2252. many complicated queries.
  2253. @item
  2254. Most requests doing a sort allocates a sort buffer and 0-2 temporary
  2255. files depending on the result set size. @xref{Temporary files}.
  2256. @item
  2257. Almost all parsing and calculating is done in a local memory store. No
  2258. memory overhead is needed for small items and the normal slow memory
  2259. allocation and freeing is avoided. Memory is allocated only for
  2260. unexpectedly large strings (this is done with @code{malloc()} and
  2261. @code{free()}).
  2262. @item
  2263. Each index file is opened once and the data file is opened once for each
  2264. concurrently running thread. For each concurrent thread, a table structure,
  2265. column structures for each column, and a buffer of size @code{3 * n} is
  2266. allocated (where @code{n} is the maximum row length, not counting @code{BLOB}
  2267. columns). A @code{BLOB} uses 5 to 8 bytes plus the length of the @code{BLOB}
  2268. data. The @code{ISAM}/@code{MyISAM} table handlers will use one extra row
  2269. buffer for internal usage.
  2270. @item
  2271. For each table having @code{BLOB} columns, a buffer is enlarged dynamically
  2272. to read in larger @code{BLOB} values. If you scan a table, a buffer as large
  2273. as the largest @code{BLOB} value is allocated.
  2274. @item
  2275. Table handlers for all in-use tables are saved in a cache and managed as a
  2276. FIFO. Normally the cache has 64 entries. If a table has been used by two
  2277. running threads at the same time, the cache contains two entries for the
  2278. table. @xref{Table cache}.
  2279. @item
  2280. A @code{mysqladmin flush-tables} command closes all tables that are not in
  2281. use and marks all in-use tables to be closed when the currently executing
  2282. thread finishes. This will effectively free most in-use memory.
  2283. @end itemize
  2284. @code{ps} and other system status programs may report that @code{mysqld}
  2285. uses a lot of memory. This may be caused by thread-stacks on different
  2286. memory addresses. For example, the Solaris version of @code{ps} counts
  2287. the unused memory between stacks as used memory. You can verify this by
  2288. checking available swap with @code{swap -s}. We have tested
  2289. @code{mysqld} with commercial memory-leakage detectors, so there should
  2290. be no memory leaks.
  2291. @cindex internal locking
  2292. @cindex locking, tables
  2293. @cindex tables, locking
  2294. @node Internal locking, Table locking, Memory use, System
  2295. @subsection How MySQL Locks Tables
  2296. You can find a discussion about different locking methods in the appendix.
  2297. @xref{Locking methods}.
  2298. All locking in @strong{MySQL} is deadlock-free.  This is managed by always
  2299. requesting all needed locks at once at the beginning of a query and always
  2300. locking the tables in the same order.
  2301. The locking method @strong{MySQL} uses for @code{WRITE} locks works as follows:
  2302. @itemize @bullet
  2303. @item
  2304. If there are no locks on the table, put a write lock on it.
  2305. @item
  2306. Otherwise, put the lock request in the write lock queue.
  2307. @end itemize
  2308. The locking method @strong{MySQL} uses for @code{READ} locks works as follows:
  2309. @itemize @bullet
  2310. @item
  2311. If there are no write locks on the table, put a read lock on it.
  2312. @item
  2313. Otherwise, put the lock request in the read lock queue.
  2314. @end itemize
  2315. When a lock is released, the lock is made available to the threads
  2316. in the write lock queue, then to the threads in the read lock queue.
  2317. This means that if you have many updates on a table, @code{SELECT}
  2318. statements will wait until there are no more updates.
  2319. To work around this for the case where you want to do many @code{INSERT} and
  2320. @code{SELECT} operations on a table, you can insert rows in a temporary
  2321. table and update the real table with the records from the temporary table
  2322. once in a while.
  2323. This can be done with the following code:
  2324. @example
  2325. mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
  2326. mysql> insert into real_table select * from insert_table;
  2327. mysql> TRUNCATE TABLE insert_table;
  2328. mysql> UNLOCK TABLES;
  2329. @end example
  2330. You can use the @code{LOW_PRIORITY} options with @code{INSERT} if you
  2331. want to prioritize retrieval in some specific cases.  @xref{INSERT, ,
  2332. @code{INSERT}}.
  2333. You could also change the locking code in @file{mysys/thr_lock.c} to use a
  2334. single queue.  In this case, write locks and read locks would have the same
  2335. priority, which might help some applications.
  2336. @cindex problems, table locking
  2337. @node Table locking, DNS, Internal locking, System
  2338. @subsection Table Locking Issues
  2339. The table locking code in @strong{MySQL} is deadlock free.
  2340. @strong{MySQL} uses table locking (instead of row locking or column
  2341. locking) on all table types, except @code{BDB} tables, to achieve a very
  2342. high lock speed.  For large tables, table locking is MUCH better than
  2343. row locking for most applications, but there are, of course, some
  2344. pitfalls.
  2345. For @code{BDB} tables, @strong{MySQL} only uses table locking if you
  2346. explicitely lock the table with @code{LOCK TABLES} or execute a command that
  2347. will modify every row in the table, like @code{ALTER TABLE}.
  2348. In @strong{MySQL} Version 3.23.7 and above, you can insert rows into
  2349. @code{MyISAM} tables at the same time other threads are reading from
  2350. the table.  Note that currently this only works if there are no holes after
  2351. deleted rows in the table at the time the insert is made.
  2352. Table locking enables many threads to read from a table at the same
  2353. time, but if a thread wants to write to a table, it must first get
  2354. exclusive access.  During the update, all other threads that want to
  2355. access this particular table will wait until the update is ready.
  2356. As updates on tables normally are considered to be more important than
  2357. @code{SELECT}, all statements that update a table have higher priority
  2358. than statements that retrieve information from a table. This should
  2359. ensure that updates are not 'starved' because one issues a lot of heavy
  2360. queries against a specific table. (You can change this by using
  2361. LOW_PRIORITY with the statement that does the update or
  2362. @code{HIGH_PRIORITY} with the @code{SELECT} statement.)
  2363. Starting from @strong{MySQL} Version 3.23.7 one can use the
  2364. @code{max_write_lock_count} variable to force @strong{MySQL} to
  2365. temporary give all @code{SELECT} statements, that wait for a table, a
  2366. higher priority after a specific number of inserts on a table.
  2367. Table locking is, however, not very good under the following senario:
  2368. @itemize @bullet
  2369. @item
  2370. A client issues a @code{SELECT} that takes a long time to run.
  2371. @item
  2372. Another client then issues an @code{UPDATE} on a used table. This client
  2373. will wait until the @code{SELECT} is finished.
  2374. @item
  2375. Another client issues another @code{SELECT} statement on the same table. As
  2376. @code{UPDATE} has higher priority than @code{SELECT}, this @code{SELECT}
  2377. will wait for the @code{UPDATE} to finish.  It will also wait for the first
  2378. @code{SELECT} to finish!
  2379. @item
  2380. A thread is waiting for something like @code{full disk}, in which case all
  2381. threads that wants to access the problem table will also be put in a waiting
  2382. state until more disk space is made available.
  2383. @end itemize
  2384. Some possible solutions to this problem are:
  2385. @itemize @bullet
  2386. @item
  2387. Try to get the @code{SELECT} statements to run faster. You may have to create
  2388. some summary tables to do this.
  2389. @item
  2390. Start @code{mysqld} with @code{--low-priority-updates}.  This will give
  2391. all statements that update (modify) a table lower priority than a @code{SELECT}
  2392. statement. In this case the last @code{SELECT} statement in the previous
  2393. scenario would execute before the @code{INSERT} statement.
  2394. @item
  2395. You can give a specific @code{INSERT}, @code{UPDATE}, or @code{DELETE}
  2396. statement lower priority with the @code{LOW_PRIORITY} attribute.
  2397. @item
  2398. Start @code{mysqld} with a low value for @strong{max_write_lock_count} to give
  2399. @code{READ} locks after a certain number of @code{WRITE} locks.
  2400. @item
  2401. You can specify that all updates from a specific thread should be done with
  2402. low priority by using the SQL command: @code{SET SQL_LOW_PRIORITY_UPDATES=1}.
  2403. @xref{SET OPTION, , @code{SET OPTION}}.
  2404. @item
  2405. You can specify that a specific @code{SELECT} is very important with the
  2406. @code{HIGH_PRIORITY} attribute. @xref{SELECT, , @code{SELECT}}.
  2407. @item
  2408. If you have problems with @code{INSERT} combined with @code{SELECT},
  2409. switch to use the new @code{MyISAM} tables as these support concurrent
  2410. @code{SELECT}s and @code{INSERT}s.
  2411. @item
  2412. If you mainly mix @code{INSERT} and @code{SELECT} statements, the
  2413. @code{DELAYED} attribute to @code{INSERT} will probably solve your problems.
  2414. @xref{INSERT, , @code{INSERT}}.
  2415. @item
  2416. If you have problems with @code{SELECT} and @code{DELETE}, the @code{LIMIT}
  2417. option to @code{DELETE} may help. @xref{DELETE, , @code{DELETE}}.
  2418. @end itemize
  2419. @cindex DNS
  2420. @cindex hostname caching
  2421. @node DNS,  , Table locking, System
  2422. @subsection How MySQL uses DNS
  2423. When a new threads connects to @code{mysqld}, @code{mysqld} will span a
  2424. new thread to handle the request.  This thread will first check if the
  2425. hostname is in the hostname cache. If not the thread will call
  2426. @code{gethostbyaddr_r()} and @code{gethostbyname_r()} to resolve the
  2427. hostname.
  2428. If the operating system doesn't support the above thread-safe calls, the
  2429. thread will lock a mutex and call @code{gethostbyaddr()} and
  2430. @code{gethostbyname()} instead. Note that in this case no other thread
  2431. can resolve other hostnames that is not in the hostname cache until the
  2432. first thread is ready.
  2433. You can disable DNS host lookup by starting @code{mysqld} with
  2434. @code{--skip-name-resolve}.  In this case you can however only use IP
  2435. names in the @strong{MySQL} privilege tables.
  2436. If you have a very slow DNS and many hosts, you can get more performance by
  2437. either disabling DNS lookop with @code{--skip-name-resolve} or by
  2438. increasing the @code{HOST_CACHE_SIZE} define (default: 128) and recompile
  2439. @code{mysqld}.
  2440. You can disable the hostname cache with @code{--skip-host-cache}. You
  2441. can clear the hostname cache with @code{FLUSH HOSTS} or @code{mysqladmin
  2442. flush-hosts}.
  2443. If you don't want to allow connections over @code{TCP/IP}, you can do this
  2444. by starting mysqld with @code{--skip-networking}.
  2445. @cindex data, size
  2446. @cindex reducing, data size
  2447. @cindex storage space, minimizing
  2448. @cindex tables, improving performance
  2449. @cindex performance, improving
  2450. @node Data size, MySQL indexes, System, Performance
  2451. @section Get Your Data as Small as Possible
  2452. One of the most basic optimization is to get your data (and indexes) to
  2453. take as little space on the disk (and in memory) as possible. This can
  2454. give huge improvements because disk reads are faster and normally less
  2455. main memory will be used. Indexing also takes less resources if
  2456. done on smaller columns.
  2457. @strong{MySQL} supports a lot of different table types and row formats.
  2458. Choosing the right table format may give you a big performance gain.
  2459. @xref{Table types}.
  2460. You can get better performance on a table and minimize storage space
  2461. using the techniques listed below:
  2462. @itemize @bullet
  2463. @item
  2464. Use the most efficient (smallest) types possible. @strong{MySQL} has
  2465. many specialized types that save disk space and memory.
  2466. @item
  2467. Use the smaller integer types if possible to get smaller tables. For
  2468. example, @code{MEDIUMINT} is often better than @code{INT}.
  2469. @item
  2470. Declare columns to be @code{NOT NULL} if possible. It makes everything
  2471. faster and you save one bit per column. Note that if you really need
  2472. @code{NULL} in your application you should definitely use it. Just avoid
  2473. having it on all columns by default.
  2474. @item
  2475. If you don't have any variable-length columns (@code{VARCHAR},
  2476. @code{TEXT}, or @code{BLOB} columns), a fixed-size record format is
  2477. used. This is faster but unfortunately may waste some space.
  2478. @xref{MyISAM table formats}.
  2479. @item
  2480. The primary index of a table should be as short as possible. This makes
  2481. identification of one row easy and efficient.
  2482. @item
  2483. For each table, you have to decide which storage/index method to
  2484. use. @xref{Table types}.
  2485. @item
  2486. Only create the indexes that you really need. Indexes are good for
  2487. retrieval but bad when you need to store things fast. If you mostly
  2488. access a table by searching on a combination of columns, make an index
  2489. on them. The first index part should be the most used column. If you are
  2490. ALWAYS using many columns, you should use the column with more duplicates
  2491. first to get better compression of the index.
  2492. @item
  2493. If it's very likely that a column has a unique prefix on the first number
  2494. of characters, it's better to only index this prefix. @strong{MySQL}
  2495. supports an index on a part of a character column. Shorter indexes are
  2496. faster not only because they take less disk space but also because they
  2497. will give you more hits in the index cache and thus fewer disk
  2498. seeks. @xref{Server parameters}.
  2499. @item
  2500. In some circumstances it can be beneficial to split into two a table that is
  2501. scanned very often. This is especially true if it is a dynamic
  2502. format table and it is possible to use a smaller static format table that
  2503. can be used to find the relevant rows when scanning the table.
  2504. @end itemize
  2505. @cindex indexes, uses for
  2506. @node MySQL indexes, Query Speed, Data size, Performance
  2507. @section How MySQL Uses Indexes
  2508. Indexes are used to find rows with a specific value of one column
  2509. fast. Without an index @strong{MySQL} has to start with the first record
  2510. and then read through the whole table until it finds the relevant
  2511. rows. The bigger the table, the more this costs. If the table has an index
  2512. for the colums in question, @strong{MySQL} can quickly get a position to
  2513. seek to in the middle of the data file without having to look at all the
  2514. data. If a table has 1000 rows, this is at least 100 times faster than
  2515. reading sequentially. Note that if you need to access almost all 1000
  2516. rows it is faster to read sequentially because we then avoid disk seeks.
  2517. All @strong{MySQL} indexes (@code{PRIMARY}, @code{UNIQUE}, and
  2518. @code{INDEX}) are stored in B-trees. Strings are automatically prefix-
  2519. and end-space compressed. @xref{CREATE INDEX, , @code{CREATE INDEX}}.
  2520. Indexes are used to:
  2521. @itemize @bullet
  2522. @item
  2523. Quickly find the rows that match a @code{WHERE} clause.
  2524. @item
  2525. Retrieve rows from other tables when performing joins.
  2526. @item
  2527. Find the @code{MAX()} or @code{MIN()} value for a specific indexed
  2528. column. This is optimized by a preprocessor that checks if you are
  2529. using @code{WHERE} key_part_# = constant on all key parts < N.  In this case
  2530. @strong{MySQL} will do a single key lookup and replace the @code{MIN()}
  2531. expression with a constant.  If all expressions are replaced with
  2532. constants, the query will return at once:
  2533. @example
  2534. SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10
  2535. @end example
  2536. @item
  2537. Sort or group a table if the sorting or grouping is done on a leftmost
  2538. prefix of a usable key (for example, @code{ORDER BY key_part_1,key_part_2 }). The
  2539. key is read in reverse order if all key parts are followed by @code{DESC}.
  2540. The index can also be used even if the @code{ORDER BY} doesn't match the index
  2541. exactly, as long as all the unused index parts and all the extra
  2542. are @code{ORDER BY} columns are constants in the @code{WHERE} clause. The
  2543. following queries will use the index to resolve the @code{ORDER BY} part:
  2544. @example
  2545. SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3;
  2546. SELECT * FROM foo WHERE column=constant ORDER BY column, key_part1;
  2547. SELECT * FROM foo WHERE key_part1=const GROUP BY key_part2;
  2548. @end example
  2549. @item
  2550. In some cases a query can be optimized to retrieve values without
  2551. consulting the data file. If all used columns for some table are numeric
  2552. and form a leftmost prefix for some key, the values may be retrieved
  2553. from the index tree for greater speed:
  2554. @example
  2555. SELECT key_part3 FROM table_name WHERE key_part1=1
  2556. @end example
  2557. @end itemize
  2558. Suppose you issue the following @code{SELECT} statement:
  2559. @example
  2560. mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
  2561. @end example
  2562. If a multiple-column index exists on @code{col1} and @code{col2}, the
  2563. appropriate rows can be fetched directly. If separate single-column
  2564. indexes exist on @code{col1} and @code{col2}, the optimizer tries to
  2565. find the most restrictive index by deciding which index will find fewer
  2566. rows and using that index to fetch the rows.
  2567. @cindex indexes, leftmost prefix of
  2568. @cindex leftmost prefix of indexes
  2569. If the table has a multiple-column index, any leftmost prefix of the
  2570. index can be used by the optimizer to find rows. For example, if you
  2571. have a three-column index on @code{(col1,col2,col3)}, you have indexed
  2572. search capabilities on @code{(col1)}, @code{(col1,col2)}, and
  2573. @code{(col1,col2,col3)}.
  2574. @strong{MySQL} can't use a partial index if the columns don't form a
  2575. leftmost prefix of the index.  Suppose you have the @code{SELECT}
  2576. statements shown below:
  2577. @example
  2578. mysql> SELECT * FROM tbl_name WHERE col1=val1;
  2579. mysql> SELECT * FROM tbl_name WHERE col2=val2;
  2580. mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
  2581. @end example
  2582. If an index exists on @code{(col1,col2,col3)}, only the first query
  2583. shown above uses the index. The second and third queries do involve
  2584. indexed columns, but @code{(col2)} and @code{(col2,col3)} are not
  2585. leftmost prefixes of @code{(col1,col2,col3)}.
  2586. @findex LIKE, and indexes
  2587. @findex LIKE, and wildcards
  2588. @cindex indexes, and @code{LIKE}
  2589. @cindex wildcards, and @code{LIKE}
  2590. @strong{MySQL} also uses indexes for @code{LIKE} comparisons if the argument
  2591. to @code{LIKE} is a constant string that doesn't start with a wild-card
  2592. character.  For example, the following @code{SELECT} statements use indexes:
  2593. @example
  2594. mysql> select * from tbl_name where key_col LIKE "Patrick%";
  2595. mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";
  2596. @end example
  2597. In the first statement, only rows with @code{"Patrick" <= key_col <
  2598. "Patricl"} are considered.  In the second statement, only rows with
  2599. @code{"Pat" <= key_col < "Pau"} are considered.
  2600. The following @code{SELECT} statements will not use indexes:
  2601. @example
  2602. mysql> select * from tbl_name where key_col LIKE "%Patrick%";
  2603. mysql> select * from tbl_name where key_col LIKE other_col;
  2604. @end example
  2605. In the first statement, the @code{LIKE} value begins with a wild-card
  2606. character.  In the second statement, the @code{LIKE} value is not a
  2607. constant.
  2608. @findex IS NULL, and indexes
  2609. @cindex indexes, and @code{IS NULL}
  2610. Searching using @code{column_name IS NULL} will use indexes if column_name
  2611. is an index.
  2612. @strong{MySQL} normally uses the index that finds the least number of rows. An
  2613. index is used for columns that you compare with the following operators:
  2614. @code{=}, @code{>}, @code{>=}, @code{<}, @code{<=}, @code{BETWEEN}, and a
  2615. @code{LIKE} with a non-wild-card prefix like @code{'something%'}.
  2616. Any index that doesn't span all @code{AND} levels in the @code{WHERE} clause
  2617. is not used to optimize the query. In other words:  To be able to use an
  2618. index, a prefix of the index must be used in every @code{AND} group.
  2619. The following @code{WHERE} clauses use indexes:
  2620. @example
  2621. ... WHERE index_part1=1 AND index_part2=2 AND other_column=3
  2622. ... WHERE index=1 OR A=10 AND index=2      /* index = 1 OR index = 2 */
  2623. ... WHERE index_part1='hello' AND index_part_3=5
  2624.           /* optimized like "index_part1='hello'" */
  2625. ... WHERE index1=1 and index2=2 or index1=3 and index3=3;
  2626.           /* Can use index on index1 but not on index2 or index 3 */
  2627. @end example
  2628. These @code{WHERE} clauses do @strong{NOT} use indexes:
  2629. @example
  2630. ... WHERE index_part2=1 AND index_part3=2  /* index_part_1 is not used */
  2631. ... WHERE index=1 OR A=10                  /* Index is not used in both AND parts */
  2632. ... WHERE index_part1=1 OR index_part2=10  /* No index spans all rows */
  2633. @end example
  2634. Note that in some cases @strong{MySQL} will not use an index, even if one
  2635. would be available.  Some of the cases where this happens are:
  2636. @itemize @bullet
  2637. @item
  2638. If the use of the index would require @strong{MySQL} to access more
  2639. than 30 % of the rows in the table.  (In this case a table scan is
  2640. probably much faster, as this will require us to do much fewer seeks).
  2641. Note that if such a query uses @code{LIMIT} to only retrieve
  2642. part of the rows, @strong{MySQL} will use an index anyway, as it can
  2643. much more quickly find the few rows to return in the result.
  2644. @end itemize
  2645. @cindex queries, speed of
  2646. @cindex permission checks, effect on speed
  2647. @cindex speed, of queries
  2648. @node Query Speed, Tips, MySQL indexes, Performance
  2649. @section Speed of Queries that Access or Update Data
  2650. First, one thing that affects all queries: The more complex permission
  2651. system setup you have, the more overhead you get.
  2652. If you do not have any @code{GRANT} statements done, @strong{MySQL} will
  2653. optimize the permission checking somewhat. So if you have a very high
  2654. volume it may be worth the time to avoid grants. Otherwise more
  2655. permission check results in a larger overhead.
  2656. If your problem is with some explicit @strong{MySQL} function, you can
  2657. always time this in the @strong{MySQL} client:
  2658. @example
  2659. mysql> select benchmark(1000000,1+1);
  2660. +------------------------+
  2661. | benchmark(1000000,1+1) |
  2662. +------------------------+