Table partitioning and sharding are two concepts used to manage large data in distributed SQL deployments. Table partitioning involves splitting large tables into smaller, independent ones based on a chosen column strategy, while sharding breaks up large tables or indexes into smaller chunks called shards that are distributed across multiple servers based on a hash or range of the primary key. In YugabyteDB, both concepts can be used, with partitioning being a user-defined SQL-level concept and sharding being an automatic storage-level concept that is performed based on the replication factor, allowing for horizontal scaling out without effort. Partitioning is often used to group data together, such as in time series workloads or row-level geo-partitioning, whereas sharding is used to distribute data across multiple nodes, separating indexes created on partitioned tables from those created on shards.