having an index on all fields is useless because the index would be a 1:1 copy of the original table, and thus be just as slow to use as the original table.
I don't understand how this can be true. Having an index on every field in the table means you will perform an indexed read on any query that uses the WHERE column <operator> <value(s)>... which means read performance will generally be better.
INSERT and UPDATE performance would definitely take a hit by indexing every column. Doing this means you have to update an index for every column, as well as the table, every time you perform an update or delete.
indices are not just used for sorting, they are used for everything you do in the WHERE clause. Without indices you force the database to do a sequencial scan (read every single record in the table one by one), the slowest operation known to databases.
Indexes aren't used for sorting at all. Sorting is a by-product that sometimes happens when you do indexed reads. The ORDER BY clause in a query should be used for sorting. Indexes aren't used for the ORDER BY column at all.
FULL SCANS are definitely not the slowest read operation in a database... Although it depends on the type of database you are using, obviously... In general if you do an indexed read of a large percentage of your table, you are wasting time, CPU and I/Os. This is because the database has to read the index first, then go read the table itself (Two I/O's FOR EACH ROW!). If you full scan the table, the database reads a boatload of rows for every I/O. That means an indexed read could do (#of_rows * 2) = I/O's... A full scan will do (rowcount/#of_rows per I/O) I/O's. If your table had 50 rows, and your database read five rows per I/O (a GROSSLY CONSERVATIVE number), a full scan will perform 10 I/Os... the indexed read will perform 200 I/Os.
I don't think you are going to notice the slowdown on inserts/updates until you are doing thousands of inserts per second.
By the time you notice the slowdown on inserts, you'll have so many records that you'll desperately need indices to make your selects work at an acceptable speed.
I agree with this, although I guess the amount of performance hit you take depends on the type of data in the table and also on the number of indexes in the table. This is why you don't want to blindly index every column in your table, you want to find those columns that are used for querying, and index THEM. (and ofcourse, this is a pretty broad statement, a lot more thought goes into this decision...)
CSN, I think Brian recommended testing performance to determine the slowdown of inserts, updates and deletes depending on the indexing strategy you come up with. That's a great idea, do it. Also, if you only ever search based on the EMAIL column, that's probably the only index you'll need for your queries. (foreign keys using this table not withstanding).
Hope that helps!
sean