It may sound like a dramatic number, and that’s because it is. One thing that is enjoyable about working on beta applications is finding new solutions and better methods to improve the user experience. The original method for displaying the recent addition of overview analytics data in the beta version of Kontrollbase was to run [...]
I've seen a few people link to an INFORMATION_SCHEMA query to be able to find any indexes that have low cardinality, in an effort to find out what indexes should be removed. This method is flawed - here's the first reason why:
PLAIN TEXT SQL:
- CREATE TABLE `sales` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `customer_id` int(11) DEFAULT NULL,
- `status` enum('archived','active') DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `status` (`status`)
- ) ENGINE=MyISAM AUTO_INCREMENT=65691 DEFAULT CHARSET=latin1;
- mysql> SELECT count(*), STATUS FROM sales GROUP BY STATUS;
- +----------+---------+
- | count(*) | STATUS |
- +----------+---------+
- | 65536 | archived | …
Just recently I came across the presentation “Bend SQL to your will with EXPLAIN” by Ligaya Turmelle via the Linked In – MySQL Speakers and Presenters group. Slides available at Slideshare. While I know a little about MySQL, I always enjoy spending time reviewing content when possible, perhaps as a good reference when asked, perhaps to glean some small point of knowledge I didn’t know, or didn’t understand completely, or had forgotten about. It’s also fun to randomly find worthwhile information.
EXPLAIN is an essential tool for MySQL developers, if you don’t know what QEP is, the listed google search link …
[Read more]The next meeting of the North Texas MySQL Users Group is next Monday and the presentation will be on designing database tables. This is part of a series for novices with MySQL and/or databases. Too often novices commit obvious sins like BIGINTs for any numeric storage field or indexing every column. EXPLAIN is a valuable tool in optimizing SELECT statements but too many DBAs do not discover it until well after they are stuck with a small, unruly group of badly designed tables.
Using EXPLAIN is seen as a 'dark art' by too many and hopefully we can get the novices in North Texas off on the right foot. The meeting is free and starts at 7:00 PM in the Sun Offices, Suite 700, 16000 Dallas Tollway, in Dallas. All are welcome and please try to be a bit early as the …
[Read more]The EXPLAIN command is an important tool to review how a SQL query is executed and in this example includes what indexes are used.
By adding a covering index I ended up with the following EXPLAIN plan I was unable to explain. The end result was a boost in server performance which was the ultimate goal.
mysql> explain select max(md) from e_r where email = 'xxxx@gmail.com' and id = '36981'; +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables …[Read more]
It is important to know and understand that while indexing columns in MySQL will generally improve performance, using the appropriate type of index can make a greater impact on performance.
There are four general index types to consider when creating an appropriate index to optimize SQL queries.
- Column Index
- Concatenated Index
- Covering Index
- Partial Index
For the purpose of this discussion I am excluding other specialized index types such as fulltext, spatial and hash in memory engine.
Example Table
For the following examples, I will use this test table structure.
DROP TABLE IF EXISTS t1; CREATE TABLE t1( id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_name VARCHAR(20) NOT NULL, first_name VARCHAR(30) NOT NULL, last_name VARCHAR(30) NOT NULL, external_id INT UNSIGNED NOT NULL, country_id SMALLINT UNSIGNED NOT NULL, PRIMARY KEY(id) ) …[Read more]
So it’s been a while since I’ve hit my blog, but I feel compelled to respond to Baron’s post, and many of the other (perhaps short sighted) criticisms out there against this new functionality that we’ve been working on for so long.
Everybody seems to be saying that this functionality should be implemented in the server, or that the better way to do this is to use these patches which add functionality to the logging that MySQL already provides. Well guess what people - what does that give you, other than some more details on you queries?
More I/O.
What’s bad on a database server?
More I/O.
Query Analyzer, whilst it does currently use a proxy to collect the statistics, doesn’t hit your disk at all. Everything is collected and aggregated in memory, it …
[Read more]
Interpreting the output of the MySQL EXPLAIN command can be
tricky. From all the information you get, some of the most
important information is:
- Full table scans
- High join size product
- Using filesorts
- Using temporary tables
This can be hard to see in the raw output. Example query:
EXPLAIN SELECT b.item_id, b.bidder_id, u.username, MAX(price)
AS price FROM bid b JOIN user u ON (b.bidder_id = u.user_id)
WHERE b.item_id = '1' GROUP BY b.bidder_id ORDER BY price
DESC
The explain outputs:
id, select_type, table, type, possible_keys, key, key_len, ref,
rows, Extra
1, SIMPLE, b, ALL, null, null, 0, null, 22660, Using where; Using
temporary; Using filesort
1, SIMPLE, u, eq_ref, PRIMARY, PRIMARY, 4,
heavybidder.b.bidder_id, 1,
We've been experimenting how to visualize the output of …
I was surprised to find yesterday when using MySQL 5.1.26-rc with a client I’m recommending 5.1 to, some information not seen in the EXPLAIN plan before while reviewing SQL Statements.
Using join buffer
+----+-------------+-------+--------+---------------+--------------+---------+------------------------+-------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+--------------+---------+------------------------+-------+----------------------------------------------+ | 1 | SIMPLE | lr | ALL | NULL | NULL | NULL | NULL | 1084 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | ca | ref | update_check | update_check | 4 | XXXXXXXXXXXXXXXXX | 4 | Using …[Read more]
At the 2008 MySQL Conference and Expo, The Pythian Group
gave away EXPLAIN
cheatsheets. They were very nice,
printed in full color and laminated to ensure you can spill your
coffee* on it and it will survive.
For those not at the conference, or those that want to make more, the file is downloadable as a 136Kb PDF at explain-diagram.pdf
* or tea, for those of us in the civilized world.