summaryrefslogtreecommitdiff
path: root/Docs/internals.texi
diff options
context:
space:
mode:
Diffstat (limited to 'Docs/internals.texi')
-rw-r--r--Docs/internals.texi134
1 files changed, 134 insertions, 0 deletions
diff --git a/Docs/internals.texi b/Docs/internals.texi
new file mode 100644
index 00000000000..01f5b0a346c
--- /dev/null
+++ b/Docs/internals.texi
@@ -0,0 +1,134 @@
+\input texinfo @c -*-texinfo-*-
+@c Copyright 1998 TcX AB, Detron HB and Monty Program KB
+@c
+@c %**start of header
+@setfilename internals.info
+@c We want the types in the same index
+@c @synindex tp fn cp
+@synindex cp fn
+@iftex
+@c Well this is normal in Europe. Maybe this shold go into the include.texi?
+@afourpaper
+@end iftex
+@c Get version and other info
+@include include.texi
+@ifclear tex-debug
+@c This removes the black squares in the right margin
+@finalout
+@end ifclear
+@c Set background for HTML
+@set _body_tags BGCOLOR=#FFFFFF TEXT=#000000 LINK=#101090 VLINK=#7030B0
+@settitle @strong{MySQL} internals Manual for version @value{mysql_version}.
+@setchapternewpage off
+@c %**end of header
+
+@ifinfo
+@format
+START-INFO-DIR-ENTRY
+* mysql-internals: (mysql-internals). @strong{MySQL} internals.
+END-INFO-DIR-ENTRY
+@end format
+@end ifinfo
+
+@titlepage
+@sp 10
+@center @titlefont{@strong{MySQL} Internals Manual.}
+@sp 10
+@center Copyright @copyright{} 1998 TcX AB, Detron HB and Monty Program KB
+@end titlepage
+
+@node Top, Introduction, (dir), (dir)
+
+@ifinfo
+This is a manual about @strong{MySQL} internals.
+@end ifinfo
+
+@menu
+@end menu
+
+@node caching
+@chapter How do MySQL handle caching
+
+MySQL has the following caches:
+(Note that the some of the filename has wrong spelling of cache :)
+
+@itemize @bullet
+@item Key cache
+A shared cache for all B-tree index blocks in the different NISAM
+files. Uses hashing and reverse linked lists for quick caching of the
+last used blocks and quick flushing of changed entries for a specific
+table. mysys/mf_keycash.c
+
+@item Record cache
+This is used for quick scanning of all records in a table.
+mysys/mf_iocash.c and isam/_cash.c
+
+@item Table cache
+This holds the last used tables. sql/sql_base.cc
+
+@item Hostname cache
+For quick lookup (with reverse name resolving). Is a must when one has a
+slow DNS. sql/hostname.cc
+
+@item Privilege cache
+To allow quick change between databases the last used privileges are
+cached for each user/database combination. sql/sql_acl.cc
+
+@item Heap table cache
+Many use of GROUP BY or DISTINCT caches all found
+rows in a HEAP table (this is a very quick, in memory table with hash index)
+
+@item Join row cache.
+For every full join in a SELECT statement (a full join here means there
+was no keys that one could use to find the next table in a list), the
+found rows are cached in a join cache. One SELECT query can use many
+join caches in the worst case.
+@end itemize
+
+@node flush tables
+@chapter How do MySQL handle flush tables
+
+@itemize @bullet
+@item
+Flush tables is handled in sql/sql_base.cc::close_cached_tables().
+@Item
+The idea of flush tables is to force all tables to be closed. This
+is mainly to ensure that if someone adds a new table outside of
+MySQL (for example with 'cp') all threads will start using the new table.
+This will also ensure that all table changes are flushed to disk
+(but of course not as optimally as simple calling a sync on all tables)!
+@item
+When one does a 'flush tables', the variable 'refresh_version' will
+be incremented. Every time a thread releases a table it checks if
+the refresh version of the table (updated at open) is the same as
+the current refresh_version. If not it will close it and broadcast
+a signal on COND_refresh (to wait any thread that is waiting for
+all instanses of a table to be closed).
+@item
+The current refresh_version is also compared to the open refresh_version
+after a thread gets a lock on a table. If the refresh version is
+different the thread will free all locks, reopen the table and try
+to get the locks again; This is just to quickly get all tables to
+use the newest version. This is handled by
+sql/lock.cc::mysql_lock_tables() and sql/sql_base.cc::wait_for_tables().
+@item
+When all tables has been closed flush-tables will return an ok to client.
+@item
+If the thread that is doing flush-table has a lock on some tables,
+it will first closes the locked tables, wait until all other threads
+have also closed these and then reopen these and get the locks.
+After this it will give other threads a possibility to open the
+same tables.
+@end itemize
+
+@node Index
+@unnumbered Index
+
+@printindex fn
+
+@summarycontents
+@contents
+
+@bye
+
+Do text here do something ??