Unix Technical Forum

SEO

vBulletin Search Engine Optimization


Go Back   Unix Technical Forum > Database Server Software > MySQL

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 03-17-2008, 06:13 AM
Rilson
 
Posts: n/a
Default tmpdir

I used tmpfs to mount a dir on my system (a 10GB RAM dir) and passed
this to tmpdir in my.cnf. My idea was to try to speed up index
creation, because it is taking hours. However, it did not work.

The tmpfs dir is completely idle during the index creation even though
mysql states "copy to tmp table".

What is it wrong?

I want MySQL create temporary tables in memory rather than create them
on disk.

Thanks,
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 03-17-2008, 06:14 AM
Axel Schwenke
 
Posts: n/a
Default Re: tmpdir

Rilson <rilson.nascimento@gmail.com> wrote:

> I used tmpfs to mount a dir on my system (a 10GB RAM dir) and passed
> this to tmpdir in my.cnf. My idea was to try to speed up index
> creation, because it is taking hours. However, it did not work.


Bad idea anyway. tmpfs will overflow to swap if no RAM is available.
Also it will interfere with MySQL in-process caching and kernel-level
page cache.

MySQL can and will create temporary tables in memory.
See the tmp_table_size variable here:

http://dev.mysql.com/doc/refman/5.0/...variables.html

> The tmpfs dir is completely idle during the index creation even though
> mysql states "copy to tmp table".
>
> What is it wrong?


Nothing. Creating indexes will not use a temporary table. With one
exception: if this is an InnoDB table and you re-create the PRIMARY
KEY, then a copy of the table is created inside the InnoDB table space.
If you want to relieve the I/O system of your server, configure a huge
innodb_buffer_pool_size.

> I want MySQL create temporary tables in memory rather than create them
> on disk.


I suggest you first learn how MySQL uses memory before you play with
settings you don't understand. Putting tmpdir into a RAM disk is the
wrong solution in 99% of the cases.


XL
--
Axel Schwenke, Support Engineer, MySQL AB

Online User Manual: http://dev.mysql.com/doc/refman/5.0/en/
MySQL User Forums: http://forums.mysql.com/
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 03-20-2008, 12:47 PM
Axel Schwenke
 
Posts: n/a
Default Re: tmpdir

Rilson, please keep the discussion here. I'm answering your email
in public here. Hope that's OK.

On Sun, Mar 16, 2008 at 07:20:06PM -0700, Rilson wrote:
>
> > Nothing. Creating indexes will not use a temporary table. With one
> > exception: if this is an InnoDB table and you re-create the PRIMARY
> > KEY, then a copy of the table is created inside the InnoDB table space.
> > If you want to relieve the I/O system of your server, configure a huge
> > innodb_buffer_pool_size.

>
> I create the PK after loading the data (which is pre-sorted on PK's
> keys). So I'm not re-creating PKs, right?


You are exactly doing that. If your (InnoDB) table definition does not
contain a PRIMARY KEY then InnoDB will create a synthetic one (much
like BIGINT UNSIGNED AUTO_INCREMENT). If you later define a natural
PRIMARY KEY then InnoDB will recreate the whole table.

This behavior is InnoDB-specific. InnoDB clusters data by PK and uses
the PK to reference rows in secondary indexes. So you cannot have no PK
and a modification of the PK will require to rebuild not only all
indexes but also the tree holding the records itself.

> Allow me to explain the context:
> - I have 5 InnoDB tables loaded and without indexes (total 10GB)
> - I need to create PK and secondary indexes for all tables (the PK is
> created first, then 3 or 4 indexes for each table)
> - I have 32GB RAM dedicated to MySQL
> - I'm using InnoDB
>
> Questions:
> - What's the strategy to have the indexes created with the least
> amount of time possible?
> - It would be faster to load the data with PK and secondary indexes
> pre-defined?


The best strategy would be:

1. create table, including PK

2. load data in batches. Either use extended INSERT syntax with
*long* statements (worth some hundreds of rows) or use explicite
transactions, committing every 1000 rows [1]
alternatively: use LOAD DATA INFILE
If possible, load data in PK order

3. create secondary indexes with a single ALTER TABLE statement

With 32GB memory and only 10GB of data, this should be possible without
touching the disk. Just configure a huge innodb_buffer_pool_size.
Lets say 24GB. InnoDB funnels *everything* through the page buffer.

The above will use only little more than a single CPU core at a time.
You could use 5 independent database connections to create/load the
5 tables simultaneously.

> - sort_buffer_size affects index creation?


I'm not 100% sure but AFAIK: No.

> - tmp_table_size applies to tmp tables created by a 'create index'
> operation?


No. Normally creating indexes does not copy a table.

> I learn/understand when I "play". Reading is not learning/
> understanding ==> "What we have to learn to do, we learn by doing."
> -- Aristotle


You won't learn anything by doing if you don't understand which effect
was caused by which of your actions. With systematic "playing" you
might be able to find the strategy from above, but it would take a
long time. With some insight [2] in the inner workings of InnoDB, you
could deduce the above strategy in minutes


[1] by default MySQL runs in auto-commit mode, implicitly committing
each INSERT. This leads to very poor performance. Grouping INSERTs
to bigger transactions dramatically improves this. See the figure
on page 6 here: http://shinguz.ch/MySQL/transaction_performance.pdf

[2] i.e. http://dev.mysql.com/doc/refman/5.0/...db-tuning.html
and many more pages from the MySQL manual


XL
--
Axel Schwenke, Support Engineer, MySQL AB

Online User Manual: http://dev.mysql.com/doc/refman/5.0/en/
MySQL User Forums: http://forums.mysql.com/
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4 (permalink)  
Old 03-20-2008, 12:47 PM
Rilson
 
Posts: n/a
Default Re: tmpdir

On Mar 17, 10:17 am, Axel Schwenke <axel.schwe...@gmx.de> wrote:
> Rilson, please keep the discussion here. I'm answering your email
> in public here. Hope that's OK.
>
> On Sun, Mar 16, 2008 at 07:20:06PM -0700, Rilson wrote:
>
> > > Nothing. Creating indexes will not use a temporary table. With one
> > > exception: if this is an InnoDB table and you re-create the PRIMARY
> > > KEY, then a copy of the table is created inside the InnoDB table space.
> > > If you want to relieve the I/O system of your server, configure a huge
> > > innodb_buffer_pool_size.

>
> > I create the PK after loading the data (which is pre-sorted on PK's
> > keys). So I'm not re-creating PKs, right?

>
> You are exactly doing that. If your (InnoDB) table definition does not
> contain a PRIMARY KEY then InnoDB will create a synthetic one (much
> like BIGINT UNSIGNED AUTO_INCREMENT). If you later define a natural
> PRIMARY KEY then InnoDB will recreate the whole table.
>
> This behavior is InnoDB-specific. InnoDB clusters data by PK and uses
> the PK to reference rows in secondary indexes. So you cannot have no PK
> and a modification of the PK will require to rebuild not only all
> indexes but also the tree holding the records itself.
>
> > Allow me to explain the context:
> > - I have 5 InnoDB tables loaded and without indexes (total 10GB)
> > - I need to create PK and secondary indexes for all tables (the PK is
> > created first, then 3 or 4 indexes for each table)
> > - I have 32GB RAM dedicated to MySQL
> > - I'm using InnoDB

>
> > Questions:
> > - What's the strategy to have the indexes created with the least
> > amount of time possible?
> > - It would be faster to load the data with PK and secondary indexes
> > pre-defined?

>
> The best strategy would be:
>
> 1. create table, including PK
>
> 2. load data in batches. Either use extended INSERT syntax with
> *long* statements (worth some hundreds of rows) or use explicite
> transactions, committing every 1000 rows [1]
> alternatively: use LOAD DATA INFILE
> If possible, load data in PK order
>
> 3. create secondary indexes with a single ALTER TABLE statement
>
> With 32GB memory and only 10GB of data, this should be possible without
> touching the disk. Just configure a huge innodb_buffer_pool_size.
> Lets say 24GB. InnoDB funnels *everything* through the page buffer.
>
> The above will use only little more than a single CPU core at a time.
> You could use 5 independent database connections to create/load the
> 5 tables simultaneously.
>
> > - sort_buffer_size affects index creation?

>
> I'm not 100% sure but AFAIK: No.
>
> > - tmp_table_size applies to tmp tables created by a 'create index'
> > operation?

>
> No. Normally creating indexes does not copy a table.
>
> > I learn/understand when I "play". Reading is not learning/
> > understanding ==> "What we have to learn to do, we learn by doing."
> > -- Aristotle

>
> You won't learn anything by doing if you don't understand which effect
> was caused by which of your actions. With systematic "playing" you
> might be able to find the strategy from above, but it would take a
> long time. With some insight [2] in the inner workings of InnoDB, you
> could deduce the above strategy in minutes
>
> [1] by default MySQL runs in auto-commit mode, implicitly committing
> each INSERT. This leads to very poor performance. Grouping INSERTs
> to bigger transactions dramatically improves this. See the figure
> on page 6 here:http://shinguz.ch/MySQL/transaction_performance.pdf
>
> [2] i.e.http://dev.mysql.com/doc/refman/5.0/...db-tuning.html
> and many more pages from the MySQL manual
>
> XL
> --
> Axel Schwenke, Support Engineer, MySQL AB
>
> Online User Manual:http://dev.mysql.com/doc/refman/5.0/en/
> MySQL User Forums: http://forums.mysql.com/


Thanks Axel! I'm gonna test the strategy and will let you know how it
went.

-Rilson
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #5 (permalink)  
Old 03-20-2008, 12:47 PM
Rilson
 
Posts: n/a
Default Re: tmpdir

On Mar 17, 10:17 am, Axel Schwenke <axel.schwe...@gmx.de> wrote:
> Rilson, please keep the discussion here. I'm answering your email
> in public here. Hope that's OK.
>
> On Sun, Mar 16, 2008 at 07:20:06PM -0700, Rilson wrote:
>
> > > Nothing. Creating indexes will not use a temporary table. With one
> > > exception: if this is an InnoDB table and you re-create the PRIMARY
> > > KEY, then a copy of the table is created inside the InnoDB table space.
> > > If you want to relieve the I/O system of your server, configure a huge
> > > innodb_buffer_pool_size.

>
> > I create the PK after loading the data (which is pre-sorted on PK's
> > keys). So I'm not re-creating PKs, right?

>
> You are exactly doing that. If your (InnoDB) table definition does not
> contain a PRIMARY KEY then InnoDB will create a synthetic one (much
> like BIGINT UNSIGNED AUTO_INCREMENT). If you later define a natural
> PRIMARY KEY then InnoDB will recreate the whole table.
>
> This behavior is InnoDB-specific. InnoDB clusters data by PK and uses
> the PK to reference rows in secondary indexes. So you cannot have no PK
> and a modification of the PK will require to rebuild not only all
> indexes but also the tree holding the records itself.
>
> > Allow me to explain the context:
> > - I have 5 InnoDB tables loaded and without indexes (total 10GB)
> > - I need to create PK and secondary indexes for all tables (the PK is
> > created first, then 3 or 4 indexes for each table)
> > - I have 32GB RAM dedicated to MySQL
> > - I'm using InnoDB

>
> > Questions:
> > - What's the strategy to have the indexes created with the least
> > amount of time possible?
> > - It would be faster to load the data with PK and secondary indexes
> > pre-defined?

>
> The best strategy would be:
>
> 1. create table, including PK
>
> 2. load data in batches. Either use extended INSERT syntax with
> *long* statements (worth some hundreds of rows) or use explicite
> transactions, committing every 1000 rows [1]
> alternatively: use LOAD DATA INFILE
> If possible, load data in PK order
>
> 3. create secondary indexes with a single ALTER TABLE statement
>
> With 32GB memory and only 10GB of data, this should be possible without
> touching the disk. Just configure a huge innodb_buffer_pool_size.
> Lets say 24GB. InnoDB funnels *everything* through the page buffer.
>
> The above will use only little more than a single CPU core at a time.
> You could use 5 independent database connections to create/load the
> 5 tables simultaneously.
>
> > - sort_buffer_size affects index creation?

>
> I'm not 100% sure but AFAIK: No.
>
> > - tmp_table_size applies to tmp tables created by a 'create index'
> > operation?

>
> No. Normally creating indexes does not copy a table.
>
> > I learn/understand when I "play". Reading is not learning/
> > understanding ==> "What we have to learn to do, we learn by doing."
> > -- Aristotle

>
> You won't learn anything by doing if you don't understand which effect
> was caused by which of your actions. With systematic "playing" you
> might be able to find the strategy from above, but it would take a
> long time. With some insight [2] in the inner workings of InnoDB, you
> could deduce the above strategy in minutes
>
> [1] by default MySQL runs in auto-commit mode, implicitly committing
> each INSERT. This leads to very poor performance. Grouping INSERTs
> to bigger transactions dramatically improves this. See the figure
> on page 6 here:http://shinguz.ch/MySQL/transaction_performance.pdf
>
> [2] i.e.http://dev.mysql.com/doc/refman/5.0/...db-tuning.html
> and many more pages from the MySQL manual
>
> XL
> --
> Axel Schwenke, Support Engineer, MySQL AB
>
> Online User Manual:http://dev.mysql.com/doc/refman/5.0/en/
> MySQL User Forums: http://forums.mysql.com/


I got an error in the middle of the index creation:

Creating indexes. Mon Mar 17 23:44:18 PDT 2008
ERROR 1114 (HY000) at line 7: The table '#sql-1ade_16' is full

I dedicated two disks of 16G for innodb data (fixed size). As per my
experience the set of indexes defined would double the size of the
database. Since my database has 10GB, data + indexes would take ca.
20GB on disk, so 32G (16GB + 16GB) would be more than enough. In fact,
data_free in SHOW TABLE STATUS is showing zero.

I was assuming temporary tables (like #sql-1ade_16) was being
maintained fully-cached (20GB RAM is being grabbed for mysqld, it
should be more than enough). It seems clear to me that this temp table
is being created as an auxiliary entity of a 'create index' operation
and that's being maintained on disk. Please correct me if I'm wrong.

So, which parameters should I alter to make these temp tables be
created/maintained in memory? I'm wondering how tmp_table_size and
sort_buffer_size affect index creation...

Hmm if the temp tables are being created where the tmpdir variable
points to then I think I found out my problem. /var/tmp is almost
swamped. I could redirect tmpdir to a separate disk or even to tmpfs
to speed up things.

You said that 'create index' normally does not copy a table. However,
'show processlist' always shows 'copy to tmp table' during index
creation.

Thanks,

-Rilson
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT. The time now is 09:04 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0
UnixAdminTalk.com

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838