Insert yaparken mümkün sayısı (*) yapmak olduğunu ... select ...

6 Cevap php

... Select ... sorgulamak başka bir php script ekleme yapıyor iken bir php komut dosyası basit bir count (*) sorgu yapmak mümkün mü?

Durum I ~ 1M veya diğer tablodan daha fazla satır içeren bir tablo oluşturmak gerekir, ve takarken, ben kullanıcı sayfası donma hissediyorum istemiyorum, bu yüzden ben saymayı güncelleştirmek tutmaya çalışıyorum, ama kullanarak am insert tamamlanana kadar arka yerleştirilmesinde, sadece 0 aldığımda tablodan sayısı (*) seçin.

Yani MySQL ilk kısmi bir sonuç döndürür sormak için herhangi bir yolu var mı? Ya da ... sorguyu seçin ... insert olarak aynı performansı hakkında sahip olurken, bir önceki seçim sorgusu getirilmiş veri ile ucun dizi yapmak için hızlı bir yol var mı?

Çevre php4.3 ve MySQL4.1 olduğunu.

6 Cevap

Tek bir INSERT yapıyorsanız ... SELECT, o hayır, ara sonuçlar elde etmek mümkün olmayacaktır. Aslında bu kullanıcıların bir ifade veya işlem sadece kısmi bir sonuç gösteren bir ara konumda bir veritabanı görmek asla gerektiği gibi, kötü bir şey olurdu. Daha fazla bilgi için, ACID uyum kadar okuyun.

O dedi, MyISAM motor bu hızlı ve gevşek oynayabilir. Ben MyISAM ben üzerinden o şekilde bölümünü iptal ettik zaman SELECT ... INSERT gelen tüm satırları bazı işlemek değil gördüm eminim. Eğer olsa, tablo kullanarak hangi motor demedim.

Performansını düşürmeden? Pek olası değil. Biraz performans kaybı, belki de ...

Ama neden regularily tablo oluşturma ve satır milyonlarca eklemiş olursunuz? Sadece çok nadiren bu yaparsanız, sadece bu uzun zaman alır admini (böyle bir şey yapmak için izin muhtemelen tek) uyarmak olamaz. Bunu yapıyorsanız all the time, bunu wrong yapmıyoruz gerçekten emin misin?

Ben bir PHP istek sırasında bir defada 1 milyon satır kopyalama eğer bu kırmızı bir bayrak olduğunu Stein yorum katılıyorum.

İnsanların mikro-optimize SQL için çalışıyoruz vakaların bir çoğunda, farklı bir şekilde sorunu yaklaşarak çok daha fazla performans ve verim alabilir inanıyoruz. SQL, engel olmamalıdır.

Bu taahhüt olana kadar diğer kullanıcıların ekleme göremiyorum. Onlar yarım yapılan verileri göremiyorum emin olur çünkü bu, normalde iyi bir şey. Onları ara verileri görmek isterseniz ekleme yaparken Ancak, "işlemek" için bir renkliydi çağrı atmak olabilir.

Arada - bir kimsenin autocommit açmak için size izin vermeyin. BÜYÜK bir zaman defolu mal olduğunu. Ben sürece autocommit kapattığınızda 1/3rd alır benim veritabanında bir "silme ve yeniden insert" işim var.

Sadece temiz olması için, MySQL 4 işlemler kullanmak için varsayılan olarak yapılandırılır değildir. Yanlış hatırlamıyorsam eğer, her bir ek için tüm tabloyu kilitleyen MyISAM tablo türünü kullanır.

Yapabileceğiniz en iyi şey, bu büyük miktarda veri ekleme dramatik bir şekilde daha hızlı olarak, bu tür LOAD DATA INFILE olarak MySQL toplu ekleme fonksiyonları, birini kullanmak olacaktır. Sayma gelince, iyi, 1000 (veya Y) N gruba ekler kırabilir sonra N bölümlere ilerleme metre bölmek ve sadece her grubun isteği üzerine güncelleyin.

Edit: Başka bir şey düşünmek, bu bir şablon için statik veri ise, o zaman kullanabilirsiniz, bir aynı veri ile yeni bir tablo oluşturmak için "içine seçin". Uygulama ne emin, ya da amaçlanan işlevsellik, ama bu da işe yarayabilir.

Eğer konsola alabilirsiniz varsa, size aradığınız bilgi verecek çeşitli durum sorular sorabilirsiniz. "SHOW PROCESSLIST" gibi bir şey gider bir komut var.