In MySQL5 MySQL implemented changes so you can view global status
(counters) and session counters. In 5.1 MySQL extended this and
implemented this information in the
INFORMATION_SCHEMA.GLOBAL_STATUS and
INFORMATION_STATUS.SESSION_STATUS tables.
Global status
mysql> SELECT * FROM GLOBAL_STATUS WHERE VARIABLE_NAME =
'COM_SELECT'\G*************************** 1. row
*************************** VARIABLE_NAME:
COM_SELECTVARIABLE_VALUE: 2076641 row in set (0.02 sec)
mysql> SHOW GLOBAL STATUS LIKE
'Com_select';+---------------+--------+| Variable_name | Value
|+---------------+--------+| Com_select | 207664 |
+---------------+--------+1 row in set (0.03 sec)
Session status
mysql> SHOW SESSION STATUS LIKE
'Com_select';+---------------+-------+| Variable_name | Value
|+---------------+-------+| Com_select | 13 |
+---------------+-------+1 row in set (0.02 sec)
mysql> …
At Fosdem
2010, already two weeks ago, I had the pleasure of hearing
Geert van
der Kelen explain the work he has been doing on connecting
MySQL and
Python. I don't
know anything about Python, but anybody that has the courage,
perseverance and coding skills to create an implementation of the
the MySQL wire protocol from scratch is a class-A programmer in
my book. So, I encourage everyone that needs MySQL connectivity
for Python programs to check out Geert's brainchild, MySQL
Connector/Python.
In relation to MySQL Connector/Python, I just read a post from Geert …
There are those that are very adamant about letting people know that using INFORMATION_SCHEMA can crash your database. For example, in making changes to many tables at once Baron writes:
“querying the INFORMATION_SCHEMA database on MySQL can completely lock a busy server for a long time. It can even crash it. It is very dangerous.”
Though Baron is telling the truth here, he left out one extremely important piece of information: you can actually figure out how dangerous your INFORMATION_SCHEMA query will be, ahead of time, using EXPLAIN.
In MySQL 5.1.21 and higher, not only were optimizations made to
the INFORMATION_SCHEMA, but new values were added so that EXPLAIN
had better visibility into what MySQL is actually doing. As per
…
Drizzle originally inherited the FRM file from MySQL (which
inherited it from UNIREG). The FRM file stores metadata about a
table; what columns it has, what type those columns are, what
indexes, any default values, comments etc are all stored in the
FRM. In the days of MyISAM, this worked relatively well. The row
data was stored in table.MYD, indexes on top of it in table.MYI
and information about the format of the row was
in table.FRM. Since MyISAM itself wasn’t crash safe, it didn’t
really matter if creating/deleting the FRM file along with the
table was either.
As more sophisticated engines were introduced (e.g. InnoDB) that had their own data dictionary, there started to be more of a problem. There were now two places storing information about a table: the FRM file and the data dictionary specific to the engine. Even if the data dictionary of the storage engine was crash safe, the FRM file was not plugged into that, so you …
[Read more]As an alternative to another recent blog post that answered the question “how can I truncate all the tables in my database,” I thought I’d show another way to do it, which does not use the INFORMATION_SCHEMA.
$ wget http://www.maatkit.org/get/mk-find
$ perl mk-find --exec 'TRUNCATE TABLE %D.%N'
The other example is how to alter MyISAM tables to be InnoDB. That one’s easy, too. Let’s alter all MyISAM tables in the ‘test’ database:
$ wget http://www.maatkit.org/get/mk-find
$ perl mk-find test --engine MyISAM --exec 'ALTER TABLE %D.%N ENGINE=InnoDB'
If you want to print out the commands instead of executing them, you can just use –printf instead of –exec.
Why would you do it this way instead of through the INFORMATION_SCHEMA database? I don’t think this can be …
[Read more]I generally use the following MySQL INFORMATION_SCHEMA (I_S) query to Calculate Your MySQL Database Size. This query and most others that access the MySQL INFORMATION_SCHEMA can be very slow to execute because they are not real tables and are not governed by physical data, memory buffers and indexes for example but rather internal MySQL data structures.
Mark Leith indicates in his post on innodb_stats_on_metadata that Innodb performs 8 random(ish) dives in to the index, when anybody accesses any of SHOW TABLE STATUS, SHOW INDEX, INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.STATISTICS for InnoDB tables. This can have an effect on performance, especially with a large number of Innodb tables, and a poor ratio of innodb_buffer_pool_size to disk data+index footprint.
What is even more …
[Read more]This seems quite a trivial question, but developers don’t often know what a MySQL storage engine is and how to determine what storage engine is used for a table.
The first choice is to describe the table with the DESC[RIBE] command. Side Note: people often don’t realize that DESC is a short acceptable version here.
mysql> desc stats; +---------+---------------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------------+------+-----+-------------------+----------------+ | stat_id | int(10) unsigned | NO | PRI | NULL | auto_increment | | created | timestamp | NO | | CURRENT_TIMESTAMP | | | version | tinyint(3) unsigned | NO | | NULL | | | referer | varchar(500) …[Read more]
I’ve always believed that the MySQL Information_schema.tables.table_rows figure for Innodb tables to be while approximate, approximately accurate.
Today I found that the figures varied on one table from 10x to 100x wrong.
Before performing an ALTER I always verify sizes for reference.
+---------+------------+--------+------------+------------+----------------+------------+------------+-----------+------------+ | table_s | table_name | engine | row_format | table_rows | avg_row_length | total_mb | data_mb | index_mb | today | +---------+------------+--------+------------+------------+----------------+------------+------------+-----------+------------+ | XXXXX | s_a | InnoDB | Compact | 208993 | 7475 | 1491.5312 | 1490.0156 | 1.5156 | 2009-09-09 |
mysql> alter table s_a modify col VARCHAR(255);
Query OK, 23471 rows affected (4 min 26.23 sec)
After
…[Read more]
I uploaded all of my past presentations to Slideshare recently, and realized that I hadn’t actually posted some of these on my blog in the past as well.
So I’ve created a new Presentations Page that has all of these together now.
It’s kind of funny to see the “MySQL for Oracle DBAs” presentation again - a lot has changed since 2006!
In any case, enjoy if you haven’t seen them - give them a look over if interested, and feel free to post comments or questions on the page!
Hi again!
As a sidekick for my previous post, I came up with a snippet of
code that generates the Google
Chart URL to visualize table size for the current database.
For example, for the sakila sample database, we get URL's like
this:
…[Read more]