[development] PDO and database limitations

David Strauss david at fourkitchens.com
Wed Apr 4 06:19:06 UTC 2007


As long as we're discussing major database overhauls, my main concern is
moving to proper use of referential integrity and transactions. Locking
entire tables has a very detrimental effect on high-traffic site
performance. It also messes with existing transactions. Of course, this
would require dropping MyISAM support.

Transactions need not be annoying. I very recently released a module to
make transactions much easier:

http://drupal.org/project/pressflow_transaction

Yes, it requires PHP 5 to perform its magic, but so does PDO.

Larry Garfield wrote:
> This is an RFC of sorts. :-)
> 
> At Drupalcon, I was shopping around the idea of a PDO[1] backend for Drupal.  
> For brevity, I'll just reference the blog entry I made on why I think PDO is 
> a good idea[2].  The goal is that PHP 5 users get a nice speed bump and we 
> get a start on eventually shifting Drupal's database layer from the 1997 APIs 
> to the more robust 21st century PHP standards.  Most people I talked to liked 
> the idea, so after getting a nod from Dries I've been working on it since the 
> Hackfest and made decent progress.  However, I've run into a few snags I want 
> to get a 2nd opinion on (or 3rd, or 4th, or whatever).
> 
> 1) It turns out that PDO from PECL running under PHP 5.1.6, at least, has 
> issues.  Specifically, segfault issues on otherwise perfectly sane queries.  
> This is apparently a known issue with 5.1.6, and one of the reasons 5.2 
> exists. :-)  At present, I have no solution for it other than saying "well, 
> the PDO support is only if you're running 5.2, otherwise use the existing 
> MySQL/PostgreSQL drivers, deal".  Does anyone have a problem with that, and 
> if so, an alternate solution?
> 
> 2) Like any wrapper, PDO, while it offers some really nice features with a 
> common API (like C-level prepared statements, which are what I'm mainly 
> after), has some "lowest common denominator" issues.  The main one I've run 
> into so far is that there is no reliable equivalent of mysql_num_rows() for 
> SELECT statements, only for data-changing statements[3].  In testing it 
> doesn't look like the MySQL PDO driver returns anything useful for rowCount() 
> on SELECT.  That gives us 3 options.
> 
> A) Stop using db_num_rows() on result sets.  (It's a database-specific feature 
> in the first place.)  In places where we use it, use a separate count(*) 
> query instead.  That's the more database-agnostic method, and is what the PHP 
> manual recommends[3].  If we go this route, it will involve removing the 
> db_num_rows() function from the existing mysql and postgres drivers and 
> refactoring core queries accordingly.  
> 
> B) Instead, have the PDO wrapper do a full ->fetchAll() on the result set.  
> That gives an array of array or object records (specified in the fetchAll()), 
> which can then be simply sizeof()ed in the PDO/db_num_rows() implementation.  
> The downside here is that you need to specify in the fetchAll() whether you 
> want objects or arrays.  To not horribly break any existing APIs (I'm trying 
> to minimize the footprint for now; we can break everything later), we'd need 
> to therefore fetchAll() as an array in the PDO driver and then cast back to 
> an object in db_fetch_object() (or vice versa).  That feels quite nasty to 
> me, honestly, and is probably a not-unnoticeable performance hit.
> 
> C) Drop the PDO idea.  It should come as no surprise that this is my least 
> favorite option. :-(
> 
> As my goal is that in some mythical future when we can require PHP 5 PDO 
> becomes our main database backend (and we can leverage it even more for a 
> cleaner API, faster/more stable prepared statements, etc.), I would favor 
> slimming down and generalizing our database calls now (option A) so that 
> we're better prepared in the future.  (It would also make adding support for 
> other database engines like Oracle or MS SQL easier.)  I am, however, open to 
> input and suggestions.
> 
> I am hoping I can get this into Drupal 6, but time will tell if I can get it 
> ready in time.
> 
> [1] http://www.php.net/pdo
> [2] http://www.garfieldtech.com/blog/drupalcon-php5
> [3] http://us.php.net/manual/en/function.PDOStatement-rowCount.php
> 
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 186 bytes
Desc: OpenPGP digital signature
Url : http://lists.drupal.org/pipermail/development/attachments/20070404/bbab0349/attachment.pgp 


More information about the development mailing list