粗浅理解数据库联合索引
在表中对多个列建立联合索引,比如(a, b, c),这种情况下实际建立了三个索引:
- a
- (a, b)
- (a, b, c)
因此,如果对b或者c列进行查询,就需要另外建立索引进行优化。当然,不是索引越多越好,毕竟对插入、更新数据(实际也就是I/O)会有影响。
在表中对多个列建立联合索引,比如(a, b, c),这种情况下实际建立了三个索引:
因此,如果对b或者c列进行查询,就需要另外建立索引进行优化。当然,不是索引越多越好,毕竟对插入、更新数据(实际也就是I/O)会有影响。
基本上,创建有名管道和平常的文件操作没有太大的差别。在用select对有名管道句柄进行操作时,有些比较奇怪的地方。
例如,我们有两个程序(进程),一个向有名管道写,另一个负责从有名管道读。逻辑很简单,因此我们很自然地在读进程程序中设置read_only,然后用select等待数据。
奇怪的事情发生了,select总是能返回成功,可是read的数据为空。这个问题让我们百思不得其解,结果google后发现,对于只读的有名管道,也需要设置为“读写”模式,否则它对select总是会立刻返回成功。
经过多次测试,对linux下的有名管道,如果采用select判断是否可读,需要设置以下参数:
(1)非阻塞
(2)可读可写
例如以下演示代码:
fd = open(COMMAND_PIPE, O_NONBLOCK | O_RDWR);
... ...
int ret = select(fd+1, &read_set, NULL, NULL, &timeVal);
一个简单的应用,查询数据库中的用户名,同时去掉其他重名的用户。测试数据库如下:
mysql> select name from demo;
+———+
| name |
+———+
| yxh |
| yxh |
| default |
+———+
查询时,只要限定关键词‘distinct’即可,例如:
mysql> select distinct name from demo where name != ‘default’;
+——+
| name |
+——+
| yxh |
+——+
1 row in set (0.02 sec)