1. mysql where 后面不能带聚集函数,曾经后面写了个count(*)>xx,结果被人秒了一通,自己还不知道,后来查了资料才知道,这tm是常识啊,悲剧
2.今天用到mysql往外导数据,之前都是小数据量,没出现过什么问题,今儿就碰到一大数据量的。
表的id为自增主键,只要其中几个字段,数据量比较大,得分批导出
结果又犯浑了,用的order by id limit x,y。我去,怎么查的这么慢,以为是数据太多,没注意
后来始终出不了结果,让人一看,我去,这sql写的,这扫全表的,还得排序,恍然大悟啊,改成where id> x and id < y 果断迅速跑完。
这半吊子的sql,各种悲剧啊,看来得多学习下了。。。
简介:young tableau 是一个很奇特的数据结构,它的性质是堆和BST(二叉查找树)的结合,对于查找它的效率优于堆,对于删除和插入它比BST更方便。
young tableau是一个m*n的矩阵,可以用二维数组来表示,定义如下:
1,杨氏矩阵的每一行和每一列的元素都以非递减或者非递增的形式排列。
2,如果矩阵中的某一个位置没有存储元素,则把它的值置为无穷大。
先给出一个一位数组,和它转化成的杨氏矩阵:
int a[] ={1,3,5,7,8,11,4,6,9,14,15,19,10,21,23,33,56,57,34,37,45,55,INF,INF,INF,INF,INF,INF,INF,INF};
同时需要说明的就是:对于同一个数组,将其插入到yang tableau中得到的结果是不唯一的。
接下来分别讲述young tableau 的插入,查找和删除。
插入情况:它的插入过程中需要进行调整,首先将插入的元素放在杨氏矩阵的最后一个位置,或者说横纵坐标索引都是最大值。如果图中的(6,e)的位置。假设插入的元素是x,对应在样式矩阵中的元素是 Y[i][j],则Y[i][j]要和它上面的元素Y[i][j-1]进行比较,同时x要和它坐标的元素Y[i-1][j]进行比较,即有如下的条件:
a, Y[i][j] > Y[i-1][j] and Y[i][j] > Y[i][j-1] 则Y[i][j]的位置不变,不和正上方和正左边的元素交换。
b, 除上述情况外,则在Y[i][j], Y[i-1][j], Y[i][j-1]中选取最大的那个和Y[i][j]交换。
总之具体的思路就是让大的 元素下沉,小的元素上升,下面是算法:
void sift_up(int x, int y) {// sift up int min_i; int min_j; if((y - 1) >= 0 && table[x][y-1] > table[x][y]) { min_i = x; min_j = y -1; } else { min_i = x; min_j = y; } if((x - 1) >= 0 && table[x-1][y] > table[min_i][min_j]) { min_i = x - 1; min_j = y; } if(min_i != x || min_j != y) { swap(&table[x][y], &table[min_i][min_j]); sift_up(min_i, min_j); } }
插入元素2后的结果如下:
young tableau 的插入时间复杂度是O(m+n)。
杨氏矩阵的查找:杨氏矩阵的查找也相当的简单,只要掌握了它的基本规律,就是每行每列都递增或者递减,那么从哪里开始进行元素的查找比较合适呢,左下角,如果比左下角的元素小,则向上查找,如果比左下角的元素大则向右查找。这和二叉查找树的情况相同了,左下角的元素就相当于二叉查找树的根。注意越界的情况,给出基本算法:
// if larger than current value, turn to up value, else turn to right value int find_value(int value, int *x, int *y) { //return 1 for success and valid coordinate, return 0 for fail and invalid coordinat int i, j; i = MAX_M - 1; j = 0; while(i >= 0 && j < MAX_N) { if(table[i][j] == value) { break; } else if(value < table[i][j]) { i--; } else { j++; } } if(i < 0 || j >= MAX_N) { *x = -1; *y = -1; return 0; } else { *x = i; *y = j; return 1; } }
样式矩阵的删除:
操作类似于插入操作,其时间复杂度也为O(m+n)。其操作类似于堆排序的SIFT-DOWN算法。删除算法可以描述为,首先将删除的位置(x, y)的数字删除,然后调整,把杨氏矩阵中的最大值k(可以行为主序进行搜索到最后)填入到被删除位置,然后让此数与其下面的数(k-d)和右面的数进行(k-r)比较,此时比较结果为两种,因为此时元素一定会下移:
1:k-d > k-r 将k-r 和 k进行交换
2:k-d < k-r 将k-d 和 k进行交换
举例 删除图1-1的a3位置的元素5如图1-3
同样的时间复杂度是O(m+n)。
给出完整的代码和测试样例:
#include<iostream> using namespace std; #define INFINITY 100000 #define MAX_M 5 #define MAX_N 6 int table[MAX_M][MAX_N]; // if larger than current value, turn to up value, else turn to right value int find_value(int value, int *x, int *y) { //return 1 for success and valid coordinate, return 0 for fail and invalid coordinat int i, j; i = MAX_M - 1; j = 0; while(i >= 0 && j < MAX_N) { if(table[i][j] == value) { break; } else if(value < table[i][j]) { i--; } else { j++; } } if(i < 0 || j >= MAX_N) { *x = -1; *y = -1; return 0; } else { *x = i; *y = j; return 1; } } void swap(int *a, int *b) {// swap value int temp; temp = *a; *a = *b; *b = temp; } void sift_down(int x, int y) {// sift value down int min_i, min_j; if((x + 1) < MAX_M && table[x + 1][y] < table[x][y]) { min_i = x + 1; min_j = y; } else { min_i = x; min_j = y; } if((y + 1) < MAX_N && table[x][y+1] < table[min_i][min_j]) { min_i = x; min_j = y + 1; } if(min_i != x || min_j != y) { swap(&table[x][y], &table[min_i][min_j]); sift_down(min_i, min_j); } } int delete_value(int value, int x, int y) {// delete value, //before doing delete, //the to be delete value should be find whether is in matrix if(x >= MAX_M || y >= MAX_N) { return 0; } table[x][y] = INFINITY; sift_down(x, y); } void sift_up(int x, int y) {// sift up int min_i; int min_j; if((y - 1) >= 0 && table[x][y-1] > table[x][y]) { min_i = x; min_j = y -1; } else { min_i = x; min_j = y; } if((x - 1) >= 0 && table[x-1][y] > table[min_i][min_j]) { min_i = x - 1; min_j = y; } if(min_i != x || min_j != y) { swap(&table[x][y], &table[min_i][min_j]); sift_up(min_i, min_j); } } void insert_value(int value) { table[MAX_M - 1][MAX_N - 1] = value; sift_up(MAX_M - 1, MAX_N - 1); } void main() {
1、redis-benchmark
redis基准信息,redis服务器性能检测
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能
2、redis-cli
redis-cli -h localhost -p 6380 monitor
Dump all the received requests in real time;
监控host为localhost,端口为6380,redis的连接及读写操作
redis-cli -h localhost -p 6380 info
Provide information and statistics about the server ;
提供host为localhost,端口为6380,redis服务的统计信息