如何从MySQL中的分区中选择行

时间:2013-01-01 16:53:51

标签: mysql sql partitioning database-partitioning mysql-5.1

我将300MB表分区并尝试使用此命令从p0分区进行选择查询

SELECT * FROM employees PARTITION (p0);

但我收到了以下错误

ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near '(p0)' at line 1

如何编写select查询以从特定分区获取数据?

7 个答案:

答案 0 :(得分:12)

根据您的MySql版本,在MySQL 5.6.2之前,PARTITION关键字不存在。您将使用MySQL 5.5甚至5.1,但不是5.6。如果您使用的是MySQL 5.1,那么您可以执行以下操作:

SELECT partition, count(ID)
FROM
(
    SELECT ID,
      case when condition then p1
           when condition then p2
      .....
      end as partition

    FROM
      table
) s1
GROUP BY partition

注意:以上解决方案只是解决方法,以获得您想要的输出。

您也可以尝试此查询来计算分区的总行数。

SELECT table_rows as 'count(*)' FROM information_schema.partitions WHERE table_schema = schema() and table_name ='employees' and partition_name = 'p0';

注意:您可以将table_schema = schema()更改为table_schema = 'yourschema'

答案 1 :(得分:8)

实际上,自MySQL 5.6以来,支持的语法是:

y = [i for j in range(k) for (i,k) in enumerate(x)]

答案 2 :(得分:2)

您说得对,5.1.54版本不支持明确选择PARTITION。请参阅this帖子

答案 3 :(得分:1)

不确定为什么我的答案会转换为评论;)

放回去。检查此question on DBA。它在当前版本的MYSQL中不受支持。

您也可以查看MYSQL dev article

答案 4 :(得分:1)

select * from employees partition (`p0`); 的正确格式如下所示,对我来说很好。

holder.cv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


                    StoreDetails fragment = new StoreDetails();

                    Bundle bundle = new Bundle();
                    bundle.putString("store_id",pojo.getSTORE_ID());
                    bundle.putString("store_name",pojo.getSTORE_NAME());
                    bundle.putString("address",pojo.getSTORE_ADDRESS());
                   // bundle.putString("status",pojo.getSTATUS());
                   // bundle.putString("teammember",pojo.getSTATUS());

                   fragment.setArguments(bundle);
                   FragmentManager manager=fragment.getFragmentManager();
    // in below line I am getting error 

                    FragmentTransaction ft = manager.beginTransaction().replace(R.id.container,fragment,"fragment");
                    ft.addToBackStack("fragment");
                    ft.commit();

                }
            });

答案 5 :(得分:0)

选择*来自invoice_detail分区(p1);

答案 6 :(得分:-1)

我认为有必要向可能偶然发现此页面的其他用户指出,一个300MB的表不需要分区。

300MB对于任何现代(甚至不是那么现代)的数据库来说都是微不足道的数据量,因此,如果将数据放在一个分区中的一个数据库的一个表中,则一切都会更好。