Jump to content
php.lv forumi

slikta struktūra?


ohmygod

Recommended Posts

Iepriekš viena topikā mani rāja par sliktiem algoritmiem un sliktu db struktūru. Lai arī būtībā ne vienu, ne otru neviens nav redzējis.

Bet nu bremze ir! Loģikā e.t.c. vaina nav. Logoju visas darbības ar laikiem un bez mysq inserta viss notiek man apmierinošā ātrumā. Vismaz reizes 8-10 ātrāk.

http://php.lv/f/index.php?showtopic=6109

 

Inserts notiek tabulā ar struktūru:

CREATE TABLE `tabula` (
 `id` int(11) NOT NULL auto_increment,
 `name` varchar(255) default NULL,
 `price` decimal(10,2) NOT NULL default '0.00',
 `param_1` varchar(255) default NULL,
 `param_2` varchar(255) default NULL,
 `group_id` decimal(6,0) NOT NULL default '0',
 `time` datetime NOT NULL default '0000-00-00 00:00:00',
 KEY `id` (`id`)
) ENGINE=InnoDB;

Tieši visparastākais inserts šādā tabulā ir ļoooti lēns. Iepriekš šinī tabulā notiekās searchs ar LIKE '%seg1%seg2%seg3%' un tas notiek mani pilnībā apmierinošā laikā.

 

Kas te varētu būt insertu bremzējošs?

Link to comment
Share on other sites

indexi var bremzēt insertus.

 

edit

vispārīgi http://en.wikipedia.org/wiki/Index_%28database%29

mysqlam jāskatās kāds no šiem http://dev.mysql.com/doc/mysql/search.php?...c=1-5.0&m=o

 

ja tiešām nav neviens cits index bez primārās atslēgas, tad varbūt tas selects bremzē.

palaid arī visus repair/optimize table, par skādi jau nenāks.

Edited by v3rb0
Link to comment
Share on other sites

Kas te varētu būt insertu bremzējošs?

default NULL ???

teoretiski NULL stipri samazina sql izpildes laiku...

 

+

kada velna peec shis?

`group_id` decimal(6,0) NOT NULL default '0',

kaapeec ne INT( 6 ) ???

vai vienkarshi pat MEDIUMINT

paskaties pats seit

+

nevis

KEY `id` (`id`)

bet

PRIMARY KEY (`id`)

jo Mysql nevar normaali noindekseet ....

peec tam taas vertibas ko mekleesi (grupas)

arii noindeksee

KEY `group_id` (`group_id`)......

Link to comment
Share on other sites

Ok, uzliku primary index. un decimal(6,0) vietā int. Pilnīgi nekas nemainījās.

 

Un līdz šim domāju, ka indexi tīri meklēšanu paātrina. Nesaprotu, kā viņu neesamība varētu palēnināt INSERTu! Tad jau drīzāk esamībai vajadzētu palēnināt insertus.

Pie Update varbūt bez indexiem varētu nedaudz iebremzē... bet kam viņi pie inserta?

Edited by ohmygod
Link to comment
Share on other sites

Tieši visparastākais inserts šādā tabulā ir ļoooti lēns.

Uz kāda dzelža (parametri) stāv konkrētais MySQLs? MySQL versija?

Cik liela (ieraksti tabulā) ir konkrētā tabula?

Cik lieli (ja nav file per table) ir ibdata faili?

Kas notiek ja tabulu pārkonvertē (vai uztaisa ar analogu struktūru) MyISAM? Cik tad ātri notiek inserts?

 

Jo MySQLam uz šadus simple kverijus vajadzētu izpildīt 10 000 sekundē un vairāk..

Link to comment
Share on other sites

Nesaprotu, kā viņu neesamība varētu palēnināt INSERTu! Tad jau drīzāk esamībai vajadzētu palēnināt insertus.

Indeksu neesamība pāatrina indeksus, nevis palēlina.

Tb nav indeksa - ātrāks inserts.

Ir indekss - lēnāks inserts.

 

Pie Update varbūt bez indexiem varētu nedaudz iebremzē... bet kam viņi pie inserta?

A tu zini, kas vispār ir indekss? Tb kā tas ir realizēts datubāzēs? Vispārīgā gadījumā tā ir papildus datu struktūra - vai nu sakārtots binārs koks, vai kāda hešmape.

Vai tu zini, kas ir sakārtots binārs koks? Un vai tu zini, kas ar to koku notiek, kad tajā mēģina ielikt/izmainīt/izdzēst vienu virsotni? Tas viss koks ir jāpārkārto.

Protams, datubāzes savus indeksus neglabā primitīvos sakārtotos kokos, tās parasti izmanto advancētākus kokus B-tree, B+tree, utt. Taču vienalga, šie koki ir vairāk vai mazāk jāpārkārto, kad tu izmaini atslēgas saturu, vai pievieno/izdzēs kādu.

Link to comment
Share on other sites

Bubu - viss kārtībā ir ar indexiem. Nekas manā gadījumā nemainās no tā vai viņi ir vai nav. Inserts cik lēns ir bijis, tik arī paliek.

Sekundē kādi 5-13 ieraksti.

 

 

Nomainot Innodb uz MyIsam inserts jūtami palika jūtami ātrāks. aptuveni 2x.

 

Heh - uzliku uz serva, kur šitas griezīsies. Viss notiek - ap 1000 ierakstiem sekundē. Uz MyIsam. InnoDb enīvei lēnu.

figviņzin, kas tur, bet ja jau uz MyIsam ir tik ātri - tad uz jamā aŗi palikšos.

 

Btw - MySQL 4.1.20 uz freijas. dzelzis ir Dual Xeon 3.0, 2GB RAM, SCSI cietnji.

Link to comment
Share on other sites

Nomainot Innodb uz MyIsam inserts jūtami palika jūtami ātrāks. aptuveni 2x.
MyISAM apendo ierakstus līdz ar to operacija vienkāršāka taču ir slikta konkurence (ja tas reizē jādara ar SELECTiem).

 

Btw - MySQL 4.1.20 uz freijas. dzelzis ir Dual Xeon 3.0, 2GB RAM, SCSI cietnji.
Jautājums bija par serveri uz kura tu testē un uz kura nenotiek tie INSERTi?

 

Idejiski BSD nav labākais OS priekš MySQL.. Un liekas kaut kas pavisam neforš ar innodb settingiem.. Vai nu threadi pa daudz vai logu commiti nepareizi, vai vari iepeistot innodb_* mainiigos?

Tos var dabūt ar šādu kveriju - SHOW VARIABLES LIKE 'innodb%'

Link to comment
Share on other sites

Testa serveris (P4 1.8, 1GB RAM), stāv uz winduļa.

innodb_additional_mem_pool_size	  2097152
innodb_autoextend_increment 	8
innodb_buffer_pool_awe_mem_mb 	0
innodb_buffer_pool_size 	37748736
innodb_data_file_path 	ibdata1:10M:autoextend
innodb_data_home_dir 	 
innodb_fast_shutdown 	ON
innodb_file_io_threads 	4
innodb_file_per_table 	OFF
innodb_flush_log_at_trx_commit 	1
innodb_flush_method 	 
innodb_force_recovery 	0
innodb_lock_wait_timeout 	50
innodb_locks_unsafe_for_binlog 	OFF
innodb_log_arch_dir 	 
innodb_log_archive 	OFF
innodb_log_buffer_size 	1048576
innodb_log_file_size 	18874368
innodb_log_files_in_group 	2
innodb_log_group_home_dir 	.\
innodb_max_dirty_pages_pct 	90
innodb_max_purge_lag 	0
innodb_mirrored_log_groups 	1
innodb_open_files 	300
innodb_table_locks 	ON
innodb_thread_concurrency 	8

 

Serveris

innodb_additional_mem_pool_size	  1048576
innodb_autoextend_increment 	8
innodb_buffer_pool_awe_mem_mb 	0
innodb_buffer_pool_size 	8388608
innodb_data_file_path 	ibdata1:10M:autoextend
innodb_data_home_dir 	 
innodb_fast_shutdown 	ON
innodb_file_io_threads 	4
innodb_file_per_table 	OFF
innodb_flush_log_at_trx_commit 	1
innodb_flush_method 	 
innodb_force_recovery 	0
innodb_lock_wait_timeout 	50
innodb_locks_unsafe_for_binlog 	OFF
innodb_log_arch_dir 	 
innodb_log_archive 	OFF
innodb_log_buffer_size 	1048576
innodb_log_file_size 	5242880
innodb_log_files_in_group 	2
innodb_log_group_home_dir 	./
innodb_max_dirty_pages_pct 	90
innodb_max_purge_lag 	0
innodb_mirrored_log_groups 	1
innodb_open_files 	300
innodb_table_locks 	ON
innodb_thread_concurrency 	8

 

Ir tā, ka es no servu konfigur�“šanām esmu patālu un arī to nemaz nedaru, to dara pavisam cits cilv�“ks. Itkā sakarīgs....

Ja kkas nav riktīgi - būs jāsado pa kaklu :)

Edited by ohmygod
Link to comment
Share on other sites

×
×
  • Create New...