Bir tablo doldurmak için hızlı yolu

7 Cevap php

I am trying to find the fastest way to insert data into a table (data from a select) I always clear the table:

TRUNCATE TABLE table;

Sonra veri eklemek için bunu:

INSERT INTO table(id,total) (SELECT id, COUNT(id) AS Total FROM table2 GROUP BY id);

Someone told me I shouldn't do this. He said this would be much faster:

CREATE TABLE IF NOT EXISTS table (PRIMARY KEY (inskey)) SELECT id, count(id) AS total FROM table2 GROUP BY id

Any ideas on this one? I think my solution is cleaner, because I don't have to check for the table. This will be ran in a cron job a few times a day

EDIT: Ben net değildi. Kesiği her zaman koştu. Bu neden tüm verileri eklemek için hızlı sadece meselesi

7 Cevap

Ben de çözüm temizleyici, artı "birisi" tarafından çözüm bazı sorunlar var bana görünüyor düşünüyorum:

  • aslında tablo olabilir eski verileri silmez
  • tablo oluşturmak ... seçeneğini ne seçme getirileri dayalı türleri ile tablo sütunları yaratacaktır. Bu Table2 bir tablo yapısında değişiklikler tabloya yaymak anlamına gelir. Yani ya ne istediğinizi olmayabilir. En azından ben kötü bir fikir bulmak örtülü bir kaplin, tanıttı.

Performans olarak, ben bir diğerinden daha hızlı olmalıdır neden hiçbir sebep göremiyorum. Yani olağan tavsiye geçerlidir:, en temiz, en sürdürülebilir çözümü seçin test, performans :-) bir sorun olup olmadığını sadece optimize.

Sizin çözüm benim önemsiz seçim, (ben damla yok çünkü / masa ve yeniden hesaplamak sütun türünü oluşturmak emin değilim varsa) performans farkı zararı ve IMHO kilolu temizlik olurdu.

CREATE TABLE IF NOT EXISTS table (PRIMARY KEY (inskey))
SELECT  id, count(id) AS total
FROM    table2
GROUP BY
        id

Bu tablodan eski değerleri silmez.

Eğer istediğin buysa, daha hızlı gerçekten olacaktır.

Belki bir şey Birisi ve kendiniz arasında çeviri kesildi. Bir olasılık s / diye atıfta olabilir truncate / INSERT vs DAMLA / SELECT INTO olduğunu.

Ben minimal giriş (ama sonra tekrar, DROP nihai maliyeti burada ne var?) Olduğu gibi ikincisi daha hızlı olduğunu duydum. Ben bu yedeklemek için hiç zor istatistikleri var.

Bunu test etmek ve çözüme kendiniz optimize soran "sleske" un önerisi ile katılıyorum. DIY!

Every self respecting DB will give you the opportunity to rollback your transaction. 1. Rolling back your INSERT INTO... will require DB to keep track of every row inserted into the table 2. Rolling back the CREATE TABLE... is super easy for the DB - Simply get rid of the table.

Şimdi, tasarımı & olsaydı daha hızlı olacağını, DB kodlama? 1 ya da 2?

"Birisi" nin önerim Oracle kullanıyorsanız, özellikle hak var YAPAR.

Regards,
Shiva

Ben herhangi bir zaman farkı ayırt edilemez olduğundan emin değilim, ama iki yerine bir SQL deyimi, çünkü sizindir IMHO tercih edilir; INSERT deyiminde herhangi bir değişiklik, diğer deyimi hakkında daha fazla çalışma gerektirmez; ve sizin INSERT tablodaki alanları eşleştiğini doğrulamak için ana gerektirmez.

Kılavuzun Gönderen: - DDL olarak değil DML'nin daha, yani MySQL 5.1.32 ile başlayarak, TRUNCATE create table takip DAMLA TABLO olarak ikili kaydı ve çoğaltma amaçları için tedavi edilir. Bu InnoDB ve işlem yalıtım düzey deyim tabanlı günlüğü (İŞLENEN OKUYUN veya UNCOMMITTED OKUYUN) izin vermez diğer işlem depolama motorlarını kullanarak TABLOSU veya KARIŞIK günlük kullanırken, deyim açmış ve çoğaltılmış değil, gerçeği nedeniyle modu.

Eğer insert için kolaylaştırabilirsiniz:

INSERT INTO table
( SELECT id, COUNT(id) FROM table2 GROUP BY id );