2010-09-07 47 views
1

我以前讀過SELECT COUNT(*)不能在MySQL中執行,應該定期避免。 (作爲一個側面的問題,這是唯一的情況下,大量的行?)使用PDO和MySQL的SELECT COUNT(*)的最高性能替代方案

我正在使用PHP Data Objects (PDO)訪問MySQL

我應該如何計算性能考慮因素的行?

+0

'SELECT COUNT(*)FROM table'通常檢查主鍵索引並對其進行計數。另外,如果您正在使用MyISAM,則可以使用「SHOW TABLE STATUS」獲得精確的計數。 – 2010-09-07 16:12:10

回答

8

如果您使用的是MyISAM表,它不會影響性能。 MySQL 緩存 MyISAM表中的行數。這就是它能夠即時應答COUNT(*)的原因。在這種情況下,MySQL只會從存儲的值中讀取表中的行數。

[編輯]:從MySQL性能博客:

對於InnoDB:如果你有像查詢這SELECT COUNT(*) FROM IMAGE WHERE USER_ID=5查詢將通過執行指數憤怒掃描執行既爲MyISAM和InnoDB表同樣的方式。根據不同的情況,MyISAM和Innodb的速度可能會更快或更慢。

在實際應用中,第二種類型的查詢比第一種查詢要多得多,所以它通常不像它看起來那麼糟糕。最常用的行數是管理工具所需要的,這些工具可能會在表格統計中顯示,也可能在應用程序統計中用來顯示類似「我們有123.345個用戶上傳了1.344.656圖片」,但這些通常很容易刪除。

所以請記住Innodb的不是對所有COUNT()查詢放緩,但僅適用於COUNT的非常具體的情況下()查詢,而WHERE子句。

你又有趣的讀物:

+0

啊,好吧,如果只有我使用MyISAM。我正在使用InnoDB。 – 2010-09-07 16:15:28

+0

應該早一點指定。 – shamittomar 2010-09-07 16:16:34

+2

+1爲信息鏈接。 – 2010-09-07 16:19:05

2

COUNT(*),據我所知實際上比使用COUNT(columnname)更高效。如果你正在尋找一個行計數,這些將會更有效,然後試圖通過PDO或MySQL對行進行計數(因爲你不只是執行一個selectcount(),這很可能需要拉所有行)。

我不確定是否有其他方法可以計算出來,但這應該很好,這取決於你在做什麼。你應該關注的主要事項是確保你的表有適當的indexes設置,因爲如果操作正確,這將顯着提高MySQL速度等。

1

PDO是不是在運行特定數查詢真正相關。 PDO就是你連接MySQL的方式。如果你只需要一個行數,你不應該使用count(colname),你應該使用count(*)。如果指定了colname,並且該列未指定爲NOT NULL,則它會很慢。 http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/

MyISAM表緩存計數,所以MyISAM表上的計數()總是立即生效。InnoDB需要一段時間,因爲表格的狀態可能會變得不穩定,並最終得出估計。您可以爲InnoDB做一個計數(colname),其中colname是一個自動增量字段。這將是相當快速和準確的,但不會像MyISAM表上的計數()那麼快。

+0

我認爲PDO是有點相關的,因爲使用PDO很難獲得行數。 – 2010-09-07 16:23:17

+0

找到PDO數量很難,而不是行數。行計數就像另一個查詢一樣,它只是返回一行作爲結果集。 – 2010-09-08 00:38:30