Inserting and querying data in Supabase - Time & Space Complexity
When working with Supabase, it's important to know how the time to insert and get data changes as you add more records.
We want to understand how the number of operations grows when inserting and querying data.
Analyze the time complexity of the following operation sequence.
// Insert multiple rows
for (let i = 0; i < n; i++) {
await supabase
.from('items')
.insert([{ name: `Item ${i}`, value: i }])
}
// Query all rows
const { data, error } = await supabase
.from('items')
.select('*')
This code inserts n rows one by one, then fetches all rows from the table.
Identify the API calls, resource provisioning, data transfers that repeat.
- Primary operation: Insert API call inside the loop, repeated n times.
- How many times: Insert call runs once per item, so n times.
- Query operation: One select call fetching all data once after inserts.
Each insert call happens separately, so as n grows, the number of insert calls grows the same way.
| Input Size (n) | Approx. Api Calls/Operations |
|---|---|
| 10 | 10 inserts + 1 query = 11 calls |
| 100 | 100 inserts + 1 query = 101 calls |
| 1000 | 1000 inserts + 1 query = 1001 calls |
Pattern observation: The number of insert calls grows directly with n, while the query call stays constant.
Time Complexity: O(n)
This means the total time grows roughly in direct proportion to the number of items inserted.
[X] Wrong: "Inserting many rows one by one is as fast as inserting them all at once."
[OK] Correct: Each insert call takes time and network effort, so doing many calls adds up and slows things down.
Understanding how your data operations scale helps you design better apps and answer questions clearly in interviews.
"What if we inserted all rows in a single batch insert call? How would the time complexity change?"
Practice
insert() method do in Supabase?Solution
Step 1: Understand the purpose of
Theinsert()insert()method is used to add new data entries (rows) into a database table.Step 2: Differentiate from other methods
Methods likedelete()remove data,update()changes existing data, andselect()retrieves data. Onlyinsert()adds new rows.Final Answer:
Adds new rows of data to a table -> Option AQuick Check:
insert() = Add rows [OK]
- Confusing insert() with update()
- Thinking insert() deletes data
- Mixing insert() with select()
Solution
Step 1: Recall Supabase insert syntax
The correct syntax usessupabase.from('table').insert(data)to add data.Step 2: Match syntax with options
supabase.from('users').insert({name: 'Alice'}) matches the correct pattern:supabase.from('users').insert({name: 'Alice'}). Others misuse method order or names.Final Answer:
supabase.from('users').insert({name: 'Alice'}) -> Option DQuick Check:
from('table').insert(data) = correct syntax [OK]
- Swapping method order like insert().from()
- Using non-existent methods like add()
- Passing data as string instead of object
const { data, error } = await supabase
.from('products')
.select('*')
.eq('category', 'books');
console.log(data);Solution
Step 1: Understand the query filters
Theselect('*')fetches all columns, and.eq('category', 'books')filters rows where category equals 'books'.Step 2: Predict the output of console.log(data)
It will print an array of product objects matching the category 'books'. If no error, data contains matching rows.Final Answer:
An array of products where category is 'books' -> Option CQuick Check:
select('*').eq() filters rows = filtered array [OK]
- Thinking select('*') returns all rows without filter
- Assuming syntax error due to chaining
- Expecting empty array without data
const { data, error } = await supabase
.from('orders')
.insert(['item', 'quantity']);Solution
Step 1: Check insert() argument type
Theinsert()method requires an array of objects representing rows, e.g., [{item: 'apple', quantity: 2}]. Passing an array of strings is invalid.Step 2: Verify method order and usage
Callingfrom()beforeinsert()is correct. Awaiting insert() is valid. .select() after insert() is optional for returning data.Final Answer:
insert() expects an array of objects, not an array of strings -> Option AQuick Check:
insert() needs array of objects [OK]
- Passing array of strings instead of objects
- Calling from() after insert()
- Thinking insert() can't be awaited
Solution
Step 1: Insert multiple users correctly
Useinsert()with an array of objects:[{name: 'Bob', age: 25}, {name: 'Eve', age: 22}]. A single malformed object is invalid.Step 2: Query users with age > 20 after insertion
Insert first, then use a separate query:supabase.from('users').select('*').gt('age', 20). Querying before insert misses new data; chainingselect().gt()afterinsert()is invalid.Final Answer:
Insert first, then query with .gt('age', 20) -> Option BQuick Check:
Insert then query = correct order [OK]
- Querying before inserting new data
- Passing single object instead of array for multiple inserts
- Chaining select() after insert() incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
