Thursday, December 23, 2010

Bug in TokuDB

I just found a bug on MariaDB version. I was able to replicate it 4-5 times.

MariaDB [test]> show create table video;

CREATE TABLE `video` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `artist` varchar(100) NOT NULL,
  `title` varchar(100) NOT NULL,
  `video` varchar(20) NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`id`),
  KEY `video_artist_ix` (`artist`),
  KEY `video` (`video`),
  KEY `date_id` (`date`,`id`)
);



MariaDB [test]> create table x_toku(
 `id` int(4) NOT NULL AUTO_INCREMENT,
 `artist` varchar(100) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `video_artist_ix` (`artist`) 
) ENGINE=TOKUDB ;
Query OK, 0 rows affected (18.51 sec)



MariaDB [test]> insert into x_toku select id, artist from video;
Query OK, 10875440 rows affected (54.39 sec)
Records: 10875440  Duplicates: 0  Warnings: 0



MariaDB [test]> delete from x_toku where artist like 'ma%';
Query OK, 274705 rows affected (22.49 sec)



MariaDB [test]> select count(*) from x_toku where artist like 'ma%';
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
*** THIS MUST BE WRONG, DIDN'T WE DELETED EVERYTHING ***



*** THE DATA PROBABLY COMES FROM THE INDEX ***
MariaDB [test]> explain select count(*) from x_toku where artist like 'ma%';
+----+-------------+--------+-------+-----------------+-----------------+---------+------+------+--------------------------+
| id | select_type | table  | type  | possible_keys   | key             | key_len | ref  | rows | Extra                    |
+----+-------------+--------+-------+-----------------+-----------------+---------+------+------+--------------------------+
|  1 | SIMPLE      | x_toku | range | video_artist_ix | video_artist_ix | 102     | NULL |    2 | Using where; Using index |
+----+-------------+--------+-------+-----------------+-----------------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
*** YEP, USING INDEX ***



*** LETS TRY WITHOUT INDEX SCAN ***
MariaDB [test]> select count(*) from x_toku ignore index(video_artist_ix) where artist like 'ma%';
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (5.51 sec)
*** THIS STILL MUST BE WRONG, DIDN'T WE DELETED EVERYTHING ***



*** LETS SEE THE DATA ***
MariaDB [test]> select * from x_toku where artist like 'ma%';
+---------+------------------+
| id      | artist           |
+---------+------------------+
| 7953132 | mallu+adult2     |
| 6640134 | Martin+Nieverra1 |
+---------+------------------+
2 rows in set (0.00 sec)
*** HMMM ***



*** MAY BE IT GETS THE DATA IS MATERIALIZED FROM THE INDEX ***
MariaDB [test]> explain select * from x_toku where artist like 'ma%';
+----+-------------+--------+-------+-----------------+-----------------+---------+------+------+--------------------------+
| id | select_type | table  | type  | possible_keys   | key             | key_len | ref  | rows | Extra                    |
+----+-------------+--------+-------+-----------------+-----------------+---------+------+------+--------------------------+
|  1 | SIMPLE      | x_toku | range | video_artist_ix | video_artist_ix | 102     | NULL |    2 | Using where; Using index |
+----+-------------+--------+-------+-----------------+-----------------+---------+------+------+--------------------------+
1 row in set (0.03 sec)
*** YEP, USING INDEX ***



*** LETS SEE THE DATA WITHOUT INDEX SCAN ***
MariaDB [test]> select * from x_toku ignore index(video_artist_ix) where artist like 'ma%';
+----------+----------------------------------+
| id       | artist                           |
+----------+----------------------------------+
| 15292754 | Matt+Pokora+Catch+Me+If+You+Can1 |
+----------+----------------------------------+
1 row in set (5.24 sec)
*** DOUBLE HMMM ***


*** LETS SEE WHAT RECORD IS ACTUALLY REAL ***
MariaDB [test]> select * from x_toku where id in (7953132,6640134,15292754);
+----------+----------------------------------+
| id       | artist                           |
+----------+----------------------------------+
| 15292754 | Matt+Pokora+Catch+Me+If+You+Can1 |
+----------+----------------------------------+
1 row in set (0.00 sec)

Thursday, December 16, 2010

Monty says: A quick look at MySQL 5.5 GA

MySQL 5.5 is GA now.
I will soon check it more carefully, but here is what Monty says :)
Monty says: A quick look at MySQL 5.5 GA

Tuesday, December 14, 2010

MySQL bug and Optimization of nested query

There is strange bug in MySQL, it does not use primary key, if the value is NULL. Instead it do full table scan. Here is an example.
Copy / Paste this in text editor to see the correct post.

MariaDB [gateway]> explain select * from crontab where id = (select crontab from items where id = 19465650);
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table   | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
|  1 | PRIMARY     | crontab | const | PRIMARY       | PRIMARY | 4       | const |    1 |       |
|  2 | SUBQUERY    | items   | const | PRIMARY       | PRIMARY | 4       |       |    1 |       |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
2 rows in set (0.00 sec)


MariaDB [gateway]> explain select * from crontab where id = (select crontab from items where id = @id);
+----+----------------------+---------+------+---------------+------+---------+------+---------+-----------------------------------------------------+
| id | select_type          | table   | type | possible_keys | key  | key_len | ref  | rows    | Extra                                               |
+----+----------------------+---------+------+---------------+------+---------+------+---------+-----------------------------------------------------+
|  1 | PRIMARY              | crontab | ALL  | NULL          | NULL | NULL    | NULL | 3854804 | Using where                                         |
|  2 | UNCACHEABLE SUBQUERY | NULL    | NULL | NULL          | NULL | NULL    | NULL |    NULL | Impossible WHERE noticed after reading const tables |
+----+----------------------+---------+------+---------------+------+---------+------+---------+-----------------------------------------------------+
2 rows in set (0.00 sec)

MariaDB [gateway]> explain
select
   *
from
   crontab,
   items
where
   items.crontab = crontab.id and
   items.id      = @id;
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                               |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
1 row in set (0.00 sec)

Friday, December 10, 2010

Indexes on virtual columns in MariaDB 5.2

MariaDB [(none)]> use test;
Database changed
MariaDB [test]> create table x(a int not null primary key,
    ->    b varchar(32),
    ->    c int as (a mod 5) virtual,
    ->    d int as (a mod 7) persistent
    -> );
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> describe x;
+-------+-------------+------+-----+---------+---------+
| Field | Type        | Null | Key | Default | Extra   |
+-------+-------------+------+-----+---------+---------+
| a     | int(11)     | NO   | PRI | NULL    |         |
| b     | varchar(32) | YES  |     | NULL    |         |
| c     | int(11)     | YES  |     | NULL    | VIRTUAL |
| d     | int(11)     | YES  |     | NULL    | VIRTUAL |
+-------+-------------+------+-----+---------+---------+
4 rows in set (0.03 sec)

MariaDB [test]> insert into x(a,b) values(1,1),(20,20);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> select * from x;
+----+------+------+------+
| a  | b    | c    | d    |
+----+------+------+------+
|  1 | 1    |    1 |    1 |
| 20 | 20   |    0 |    6 |
+----+------+------+------+
2 rows in set (0.00 sec)

MariaDB [test]> create index c on x(c);
ERROR 1645 (HY000): Key/Index cannot be defined on a non-stored computed column
MariaDB [test]> create index d on x(d);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> explain select * from x where d = 6;
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
|  1 | SIMPLE      | x     | ref  | c             | c    | 5       | const |    1 | Using where |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)

Monday, November 15, 2010

MariaDB - drop in replacement of MySQL

MariaDB - drop in replacement of MySQL
I will speak at OpenFest conferention on 20.Nov.2010 15:00 , Sofia, Interpred, zala Plovdiv.
Map and additional info here:
http://openfest.org/archive/openfest-2010/program/

Friday, November 12, 2010

Friday, September 3, 2010

Речния кон

Книга на Йов
40.15 Ето сега речния кон който съм направил както и тебе; Яде трева като вол.
40.16 Ето сега, силата му е в чреслата му, И якостта му в мускулите на корема му.
40.17 Клати опашката си като кедър; Жилите на бедрата му са сплотени.
40.18 Костите му са като медни цеви; Ребрата му са като железни лостове.
40.19 Той е изящното дело Божие; Оня, Който го е направил, го е снабдил с меча Си.
40.20 Наистина планините промишляват за него храна. Гдето играят всичките полски зверове.
40.21 Ляга под сенчестите дървета, В скривалището на тръстиката, и в блатата;
40.22 Сенчестите дървета го покриват със сянката си; Върбите на потоците го обкръжават.
40.23 Ето, ако би придошла река, той не трепери; Не се смущава, ако би се и Иордан устремил по устата му.
40.24 Може ли някой да го хване когато е на щрек. Или да прободе носа му с примка?
41.01 Можеш ли да извлечеш крокодила с въдица, Или да притиснеш езика му с въже?
41.02 Можеш ли тури оглавник на носа му, Или да пробиеш челюстта му с кука?
41.03 Ще отправи ли той към тебе много моления? Ще ти говори ли със сладки думи?
41.04 Ще направи ли договор с тебе, Та да го вземеш за вечен слуга?
41.05 Можеш ли игра с него както с птица? Или ще го вържеш ли за забава на момичетата си?
41.06 Дружините риболовци ще търгуват ли с него? Ще го разделят ли между търговците?
41.07 Можеш ли прониза кожата му със сулици, Или главата му с рибарски копия?
41.08 Тури ръката си на него; Спомни си боя, и не прави вече това.
41.09 Ето, надеждата да го хване някой е празна; Даже от изгледа му не отпада ли човек?
41.10 Няма човек толкова дързък щото да смее да го раздразни. Тогава кой може да застане пред Мене?
41.11 Кой Ми е дал по-напред, та да му отплатя? Все що има под цялото небе е Мое.
41.12 Няма да мълча за телесните му части, нито за силата му. Нито за хубавото му устройство.
41.13 Кой може да смъкне външната му дреха? Кой може да влезе вътре в двойните му челюсти?
41.14 Кой може да отвори вратите на лицето му? Зъбите му изоколо са ужасни.
41.15 Той се гордее с наредените си люспи, Съединени заедно като че ли плътно запечатани;
41.16 Едната се допира до другата Така щото ни въздух не може да влезе между тях;
41.17 Прилепени са една за друга, Държат се помежду си тъй щото не могат да се отделят.
41.18 Когато киха блещи светлина, И очите му са като клепачите на зората.
41.19 Из устата му излизат запалени факли, И огнени искри изкачат.
41.20 Из ноздрите му излиза дим, Като на възвряло гърне над пламнали тръстики.
41.21 Дишането му запаля въглища, И пламъкът излиза из устата му.
41.22 На врата му обитава сила, И всички заплашени скачат пред него.
41.23 Пластовете на месата му са слепени, Твърди са на него, не могат се поклати.
41.24 Сърцето му е твърдо като камък, Даже твърдо като долния воденичен камък.
41.25 Когато става, силните се ужасяват, От страх се смайват.
41.26 Мечът на тогова, който би го улучил, не може да удържи, - Ни копие, ни сулица, ни остра стрела.
41.27 Той счита желязото като плява, Медта като гнило дърво.
41.28 Стрелите не могат го накара да бяга; Камъните на прашката са за него като слама;
41.29 Сопи се считат като слама; Той се присмива на махането на копието.
41.30 Като остри камъни има по долните му части; Простира като белези от диканя върху тинята;
41.31 Прави бездната да ври като котел; Прави морето като варилница за миро.
41.32 Остава подир себе си светла диря, Тъй щото някой би помислил, че бездната е побеляла от старост.
41.33 На земята няма подобен нему, Създаден да няма страх.
41.34 Той изглежда всяко високо нещо; Цар е над всичките горделиви зверове.