Am 10.02.2010 23:17, schrieb Simon Slavin:
> But that's true only if you're running a SELECT which actually uses 
> that column and only that column to do the searching. Which is why I 
> asked that question earlier on in this thread.
> Simon.
>    
The implementation of sqlite uses a B+Tree for the stored data and a 
BTree for primary keys, indexes etc. If you create a table with a 
"INTEGER PRIMARY KEY" as "CREATE TABLE" states you will end up wit only 
one table where the "INTEGER PRIMARY KEY" is the reference for your 
B+Tree where your Data resists.

If you search for more columns than the primary key value you'll get a 
faster query because the engine won't need to look up references from 
your defined primary key to the rowid in a second Btree table but use 
the primary key directly as a reference to the B+Tree. The performance 
gain is not restricted only for select but also for update, delete, insert.

You can measure this easily with a table where you define a primary key 
with "int primary key" (results in at least one b+tree and one btree) 
and the same table with "integer primary key" (results in one b+tree).

The op asked for a performance difference using integer keys and string 
keys and for sqlite a "integer primary key" is the recommended solution 
due to implementation and documentation.

It's clear that you'll loose this performance gain when you don't use 
the primary key to access your data but that's not what the op asked for 
as far as i understood his question.

Ibrahim.

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to