诺贝尔文学奖-高行健


中国第一名诺贝尔文学奖得主是高行健(法籍华裔),代表作《灵山》, 《一个人的圣经》 虽然我没有读过高行健的书籍,但是对于他的事迹,我本人是持有一些看法的,然后我看到有人这么说的一句话 :

于 1987 年流亡法国,以 “政治难民” 身份在巴黎定居。基于他的政治立场,大陆当局对当然是持否定态度的。自1989年以后,他的作品在大陆也基本上看不到。因此大陆的人们对高行健获得诺贝尔文学奖一事褒贬不一,名人们的表态也很为难而慎重。

中华人民共和国迎来了51周年华诞,举国欢腾,全国各族人民共庆这一象征中华民族彻底推翻三座大山,真正站立起来的伟大日子。然而,在斯堪地那维亚半岛上的瑞典文学院里,一场闹剧正在上演。一小撮对中国人民怀有极不健康心理的所谓文学专家,不顾中国人民的强烈反对,将新世纪第一个诺贝尔文学奖颁给了现居法国的华裔“作家”高行健。瑞典文学院的倒行逆施,极大地伤害了中华民族的感情,这是对12亿中国人民的严重挑衅。 诺贝尔文学奖揭开了中国人民淤积在心底的历史伤痕。早在19xx年,我国伟大的语言大师,著名话剧《龙须沟》的作者老舍先生即被视为诺贝尔文学奖的最有力竞争者。但是,由于众所周知的原因,老舍先生不幸逝世。而瑞典人竟敢冒天下之大不韪,冒着伤害中国人民脆弱心灵的危险,将一半已经放在老舍先生手里的诺贝尔文学奖强行颁给日本的川端康成。这是什么性质的行为?这是与中国人民为敌的行为!据此,我们可以认定,瑞典文学院是一贯反动,一贯敌视红色政权,一贯敌视中国人民的彻头彻尾的反动组织。瑞典文学院在给高行健的“颁奖书”中说,“其作品的普遍价值、刻骨铭心的洞察力和语言的丰富机智,为中文小说艺术和戏剧开辟了新的道路。”首先我们要问,其作品何在?在广袤的中国大地上,有几人知道什么高行健?其知名度,即使较之其东洋兄弟高仓健,便差之远矣,更不要说广受人民爱戴的两岸三地知名作家如琼瑶、金庸、余秋雨了。其次,什么叫“为中文小说艺术和戏剧开创了新的道路”?泱泱中华,上下五千年,早在唐朝就有剧本出现,在元朝更有光宗耀祖的伟大艺术形式元曲从天而降,中华5000年戏剧史怎能为一个区区的高行健而改写?自欺岂能欺人,欲盖反而弥彰。

有些事情一旦接触政治,可能会有一定的敏感,正所谓政治埋没人

在官本位大行其道,党国利益至上的今天,封建不在以一种制度的形式出现,而是一文化的形式继续残留在国人的血液中。很残酷吧。

高行健揭示了中国文化鲜为人知的另一面——刘再复(中国作家)


MySQL 安装时出现的 ERROR


真是装一次出现几个问题 , 总结一下吧

Q 1


[root@ftp mysql]# cp support-files/mysql.server /etc/init.d/mysql.server
[root@ftp mysql]# service mysql start
Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/mysqld/mysqld.pid).

解决

  1. 可能进程里已经存在mysql进程

查看是否有mysqld进程,如果有 kill 掉 ,然后重新启动mysqld

  1. 可能是 /usr/local/mysql/data/mysqld/ 文件夹不存在或者 /usr/local/mysql/data/mysqld/mysqld.pid 文件没有写的权限
[root@ftp data]# ps -ef | grep mysql

[root@ftp mysql]# mkdir /usr/local/mysql/data/mysqld

[root@ftp data]# chown -R mysql mysqld/
[root@ftp data]# ll
total 2109468
-rw-rw---- 1 mysql mysql         56 Mar 11 08:19 auto.cnf
-rw-rw---- 1 mysql mysql   12582912 Mar 11 08:18 ibdata1
-rw-rw---- 1 mysql mysql 1073741824 Mar 11 08:21 ib_logfile0
-rw-rw---- 1 mysql mysql 1073741824 Mar 11 08:19 ib_logfile1
drwx------ 2 mysql mysql       4096 Mar 11 08:17 mysql
drwxr-xr-x 2 mysql root        4096 Mar 11 08:24 mysqld
drwx------ 2 mysql mysql       4096 Mar 11 08:17 performance_schema
drwxr-xr-x 2 mysql mysql       4096 Mar 11 08:16 test
[root@ftp data]# service mysql start
Starting MySQL.. SUCCESS! 

[root@ftp data]# ps -ef | grep mysql
root     21436     1  0 08:25 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysqld/mysqld.pid
mysql    21996 21436  1 08:25 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/usr/local/mysql/data/mysqld/mysqld.pid --socket=/usr/local/mysql/mysql-files/mysql.sock
root     22027 20139  0 08:25 pts/0    00:00:00 grep mysql

Q 2

[root@ftp bin]# ./mysql -uroot -p
./mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

解决

显然是没有找到 libncurses.so.5 于是用root用户安装这个库

[root@ftp lib]# yum install libncurses.so.5 

Q 3

[root@ftp bin]# ./mysql -uroot -p
./mysql: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

原因主要是当前系统用的是X64位,但是系统中缺少X32的链接库,所以会报错

于是用root用户安装这个库

[root@ftp lib]# yum install libstdc++.so.6

libncurses 库用来在显示器上显示文本界面。 典型例子就是Linux内核的 make menuconfig配置界面。

[root@ftp lib]# ll /usr/lib/
total 1260
drwxr-xr-x. 3 root root   4096 Oct 21 09:39 anaconda-runtime
drwxr-xr-x. 3 root root   4096 Oct 21 09:39 ConsoleKit
dr-xr-xr-x. 2 root root   4096 Sep 23  2011 games
drwxr-xr-x  2 root root  12288 Mar 10 21:27 gconv
lrwxrwxrwx  1 root root     14 Mar 11 08:33 libform.so.5 -> libform.so.5.7
-rwxr-xr-x  1 root root  57708 Mar 16  2015 libform.so.5.7
lrwxrwxrwx  1 root root     15 Mar 11 08:33 libformw.so.5 -> libformw.so.5.7
-rwxr-xr-x  1 root root  62700 Mar 16  2015 libformw.so.5.7
lrwxrwxrwx  1 root root     24 Mar 10 21:27 libfreebl3.chk -> ../../lib/libfreebl3.chk
lrwxrwxrwx  1 root root     23 Mar 10 21:27 libfreebl3.so -> ../../lib/libfreebl3.so
lrwxrwxrwx  1 root root     28 Mar 10 21:27 libfreeblpriv3.chk -> ../../lib/libfreeblpriv3.chk
lrwxrwxrwx  1 root root     27 Mar 10 21:27 libfreeblpriv3.so -> ../../lib/libfreeblpriv3.so
-rwxr-xr-x  1 root root  17312 May 10  2016 libmemusage.so
lrwxrwxrwx  1 root root     14 Mar 11 08:33 libmenu.so.5 -> libmenu.so.5.7
-rwxr-xr-x  1 root root  28088 Mar 16  2015 libmenu.so.5.7
lrwxrwxrwx  1 root root     15 Mar 11 08:33 libmenuw.so.5 -> libmenuw.so.5.7
-rwxr-xr-x  1 root root  28760 Mar 16  2015 libmenuw.so.5.7
lrwxrwxrwx  1 root root     15 Mar 11 08:33 libpanel.so.5 -> libpanel.so.5.7
-rwxr-xr-x  1 root root  10268 Mar 16  2015 libpanel.so.5.7
lrwxrwxrwx  1 root root     16 Mar 11 08:33 libpanelw.so.5 -> libpanelw.so.5.7
-rwxr-xr-x  1 root root  10268 Mar 16  2015 libpanelw.so.5.7
-rwxr-xr-x  1 root root   7464 May 10  2016 libpcprofile.so
lrwxrwxrwx  1 root root     19 Mar 10 21:46 libstdc++.so.6 -> libstdc++.so.6.0.13
-rwxr-xr-x  1 root root 930192 May 10  2016 libstdc++.so.6.0.13
lrwxrwxrwx  1 root root     13 Mar 11 08:33 libtic.so.5 -> libtic.so.5.7
-rwxr-xr-x  1 root root  73392 Mar 16  2015 libtic.so.5.7
dr-xr-xr-x. 2 root root   4096 Oct 21 09:53 locale
drwxr-xr-x. 3 root root   4096 Aug 18  2016 python2.6
drwxr-xr-x. 3 root root   4096 Oct 21 09:53 rpm
lrwxrwxrwx. 1 root root     30 Oct 21 09:54 sendmail -> /etc/alternatives/mta-sendmail
lrwxrwxrwx. 1 root root     24 Oct 21 09:54 sendmail.postfix -> ../sbin/sendmail.postfix
drwxr-xr-x. 2 root root   4096 Jul 13  2016 yum-plugins

Q 4

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

解决

打开/etc/my.cnf,看看里面配置的 socket 位置目录

socket=/usr/local/mysql/mysql-files/mysql.sock

路径和 /tmp/mysql.sock 不一致。建立一个软连接

ln -s /usr/local/mysql/mysql-files/mysql.sock /tmp/mysql.sock

[root@ftp bin]# ./mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mysqld             |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.03 sec)

mysql> 


MySQL 启动 mysqld & mysqld_safe


mysqld 和mysqld_safe

mysqld_safe 是一个可执行的 shell 脚本,会在启动 mysql 服务器后继续监控其运行情况,并在 mysqld 死机时重新启动它 用来测试当前是否有 mysqld 进程如果不存在就 restart

while true
do
  # Some extra safety
  if [ ! -h "$safe_mysql_unix_port" ]; then
    rm -f "$safe_mysql_unix_port"
  fi
  if [ ! -h "$pid_file" ]; then
    rm -f "$pid_file"
  fi

  start_time=`date +%M%S`

  eval_log_error "$cmd"

  if [ $want_syslog -eq 0 -a ! -f "$err_log" -a ! -h "$err_log" ]; then
    touch "$err_log"                    # hypothetical: log was renamed but not
    chown $user "$err_log"              # flushed yet. we'd recreate it with
    chmod "$fmode" "$err_log"           # wrong owner next time we log, so set
  fi                                    # it up correctly while we can!

  end_time=`date +%M%S`

  if test ! -f "$pid_file"              # This is removed if normal shutdown
  then
    break
  fi


  # sanity check if time reading is sane and there's sleep
  if test $end_time -gt 0 -a $have_sleep -gt 0
  then
    # throttle down the fast restarts
    if test $end_time -eq $start_time
    then
      fast_restart=`expr $fast_restart + 1`
      if test $fast_restart -ge $max_fast_restarts
      then
        log_notice "The server is respawning too fast. Sleeping for 1 second."
        sleep 1
        sleep_state=$?
          have_sleep=0
        fi

        fast_restart=0
      fi
    else
      fast_restart=0
    fi
  fi

  if true && test $KILL_MYSQLD -eq 1
  then
    # Test if one process was hanging.
    # This is only a fix for Linux (running as base 3 mysqld processes)
    # but should work for the rest of the servers.
    # The only thing is ps x => redhat 5 gives warnings when using ps -x.
    # kill -9 is used or the process won't react on the kill.
    numofproces=`ps xaww | grep -v "grep" | grep "$ledir/$MYSQLD\>" | grep -c "pid-file=$pid_file"`

    log_notice "Number of processes running now: $numofproces"
    I=1
    while test "$I" -le "$numofproces"
    do
      PROC=`ps xaww | grep "$ledir/$MYSQLD\>" | grep -v "grep" | grep "pid-file=$pid_file" | sed -n '$p'`

      for T in $PROC
      do
        break
      done
      #    echo "TEST $I - $T **"
      if kill -9 $T
      then
        log_error "$MYSQLD process hanging, pid $T - killed"
      else
        break
      fi
      I=`expr $I + 1`
    done
  fi
  log_notice "mysqld restarted"
done

log_notice "mysqld from pid file $pid_file ended"


mysqld 才是二进制文件

# 查看文件的类型, 会发现mysqld 是二进制文件  mysqld_safe是shell脚本

root@moon:/usr/local/mysql/bin# file /usr/local/mysql/bin/mysqld
/usr/local/mysql/bin/mysqld: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=7c8abfc71b95a74d7804f89e41bdc902e22f4ea9, not stripped

# mysqld_safe是shell脚本
root@moon:/usr/local/mysql/bin# file /usr/local/mysql/bin/mysqld_safe
/usr/local/mysql/bin/mysqld_safe: POSIX shell script, ASCII text executable

如果把当前的mysqld kill掉,会发现mysqld的进程还是存在

# 查看当前的mysqld进程

ps -ef |grep mysqld

root@moon:/usr/local/mysql/bin# ps -ef |grep mysqld
root      8137  5813  0 19:41 pts/0    00:00:00 grep --color=auto mysqld
root     16502     1  0 Feb24 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --pid-file=/usr/local/mysql/var/moon.pid
mysql    16991 16502  0 Feb24 ?        00:03:23 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/var/moon.err --open-files-limit=65535 --pid-file=/usr/local/mysql/var/moon.pid --socket=/tmp/mysql.sock --port=3306
root@moon:/usr/local/mysql/bin# 


# 杀死mysqld 
kill -9 进程的ID

# 再查看当前的mysqld进程 , 发现会仍然存在  , 只不过是进程ID 换了   
ps -ef | grep mysqld

# 真正杀死mysql 进程 ,所以不能只kill mysqld ,可以通过killall 命令把 mysqld 和mysqld_safe 同时kill 掉
killall -9 mysqld mysqld_safe

ps -ef | grep mysqld

# 然后用mysqld 启动  ,就没有mysqld_safe

MySQL 表操作


表可以说 是关系型数据库的核心 默认存储基于行的方式存储,也就是一条一条的记录,每一行记录里面有一个一个的列

创建表 create table table_name (.....)

删除表 drop table table_name

查询表信息 show create table table_name

修改表 alter table 可以修改表结构 或者 表定义,比如添加索引,alter table table_name add index 列名

对于 MySQL5.5 中在 修改添加索引操作的时候, 对表加S锁 (只读) 也就是说 在添加索引的时候,其他的线程只能进行读操作,如果有写操作出现的话,就会发生等待,如果表中的数据很大,添加 索引的就会耗费很长一段时间,在这个段时间里,业务就有可能会受到影响

MySQL5.6之后 新加了一个 online ,也就是说允许在线操作,也就是说操作的时候不会阻塞其他的操作线程,也就是说进行添加索引的时候,其他的线程不仅可以读,也允许增删改查操作

下面的表格是在 **官网上 扣过来的 ** 不难看出添加删除索引 的时候是允许并发的增删改查,添加全文索引 FULLTEXT , 改变列的数据类型,删除主键 , 指定和转换字符集, 的时候 不允许并发增删改查

OperationIn-Place?Rebuilds Table?Permits Concurrent DML?(允许并发的 增删改查)Only Modifies Metadata?Notes
CREATE INDEX, ADD INDEXYes*No*YesNoRestrictions apply for FULLTEXT indexes; see next row.
ADD FULLTEXT INDEXYes*No*NoNoAdding the first FULLTEXT index rebuilds the table if there is no user-defined FTS_DOC_ID column. Subsequent FULLTEXT indexes may be added on the same table without rebuilding the table.
DROP INDEXYesNoYesYesOnly modifies table metadata.
OPTIMIZE TABLEYes*YesYesNoPerformed in-place as of MySQL 5.6.17. In-place operation is not supported for tables with FULLTEXT indexes.
Set column default valueYesNoYesYesOnly modifies table metadata.
Change auto-increment valueYesNoYesNo*Modifies a value stored in memory, not the data file.
Add foreign key constraintYes*NoYesYesThe INPLACE algorithm is supported when foreign_key_checks is disabled. Otherwise, only the COPY algorithm is supported.
Drop foreign key constraintYesNoYesYesforeign_key_checks can be enabled or disabled.
Rename columnYesNoYes*YesTo permit concurrent DML, keep the same data type and only change the column name.
Add columnYesYesYes*NoConcurrent DML is not permitted when adding an auto-increment column. Data is reorganized substantially, making it an expensive operation.
Drop columnYesYesYesNoData is reorganized substantially, making it an expensive operation.
Reorder columnsYesYesYesNoData is reorganized substantially, making it an expensive operation.
Change ROW_FORMAT propertyYesYesYesNoData is reorganized substantially, making it an expensive operation.
OperationIn-Place?Rebuilds Table?Permits Concurrent DML?(允许并发的 增删改查)Only Modifies Metadata?Notes
Change KEY_BLOCK_SIZE propertyYesYesYesNoData is reorganized substantially, making it an expensive operation.
Make column NULLYesYesYesNoData is reorganized substantially, making it an expensive operation.
Make column NOT NULLYes*YesYesNoSTRICT_ALL_TABLES or STRICT_TRANS_TABLES SQL_MODE is required for the operation to succeed. The operation fails if the column contains NULL values. As of 5.6.7, the server prohibits changes to foreign key columns that have the potential to cause loss of referential integrity. See Section 13.1.7, “ALTER TABLE Syntax”. Data is reorganized substantially, making it an expensive operation.
Change column data typeNoYesNoNoOnly supports ALGORITHM=COPY
Add primary keyYes*YesYesNoData is reorganized substantially, making it an expensive operation. ALGORITHM=INPLACE is not permitted under certain conditions if columns have to be converted to NOT NULL.
Drop primary key and add anotherYesYesYesNoData is reorganized substantially, making it an expensive operation.
Drop primary keyNoYesNoNoOnly ALGORITHM=COPY supports dropping a primary key without adding a new one in the same ALTER TABLE statement.
Convert character setNoYes*NoNoRebuilds the table if the new character encoding is different.
Specify character setNoYes*NoNoRebuilds the table if the new character encoding is different.
Rebuild with FORCE optionYes*YesYesNoUses ALGORITHM=INPLACE as of MySQL 5.6.17. ALGORITHM=INPLACE is not supported for tables with FULLTEXT indexes.
“null” rebuild using ALTER TABLE ... ENGINE=INNODBYes*YesYesNoUses ALGORITHM=INPLACE as of MySQL 5.6.17. ALGORITHM=INPLACE is not supported for tables with FULLTEXT indexes.
Set STATS_PERSISTENT, STATS_AUTO_RECALC, STATS_SAMPLE_PAGES persistent statistics optionsYesNoYesYesOnly modifies table metadata.

分区操作

将一个表或者引擎分解为多个更小,或者跟可管理的部分就叫做分区表,目前的MySQL只支持水平分区,而且每个分区保存自己的数据索引

简单说 ,分区表就是把一个表拆分成多个表来存储数据

mysql 分区表支持的分区 类型: ` range , list , hash , key , colum ns `


mysql> create table one_1(a int primary key, b varchar(10))engine=innodb
    -> partition by hash (a)
    -> ;
Query OK, 0 rows affected (0.35 sec)

mysql> create table one_2(a int primary key, b varchar(10))engine=innodb
    -> partition by hash (b)
    -> ;
ERROR 1659 (HY000): Field 'b' is of a not allowed type for this type of partitio
ning
mysql> create table one_2(a int , b int)engine=innodb
    -> partition by hash (b)
    -> ;
Query OK, 0 rows affected (0.41 sec)


mysql> create table two(a int , b varchar(10))engine=innodb
    -> partition by key(a)
    -> partitions 4;
Query OK, 0 rows affected (1.44 sec)

-- key 分区能直接把一个列进行 hash ,转成int  
mysql> create table two_1(a int , b varchar(10))engine=innodb
    -> partition by key(b)
    -> partitions 4
    -> ;
Query OK, 0 rows affected (1.37 sec)

mysql> show create table tw\G
*************************** 1. row ***************************
       Table: two_1
Create Table: CREATE TABLE `two_1` (
  `a` int(11) DEFAULT NULL,
  `b` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
/*!50100 PARTITION BY KEY (b)
PARTITIONS 4 */
1 row in set (0.07 sec)


mysql> create table two_2(a int , b datetime)engine=innodb
    -> partition by hash (b)
    -> ;
ERROR 1659 (HY000): Field 'b' is of a not allowed type for this type of partitio
ning

-- hash 可以把时间类型转换成 int 类型再去  分区
mysql> create table two_2(a int , b datetime)engine=innodb
    -> partition by hash (year(b))
    -> ;
Query OK, 0 rows affected (0.43 sec)

-- less than 必须严格递增分区
mysql> create table three(a int , b datetime)engine=innodb
    -> partition by range columns (b)(
    -> partition f1 values less than ("2017-01-01"),
    -> partition f2 values less than ("2016-01-01"),
    -> partition f3 values less than ("2015-01-01")
    -> );
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each
partition

/*
对哪个列进行分区,根据对应列的数据类型写出相应的表示方法,比如  datetime  类型 默认的是  YYYY-MM-DD
*/
mysql> create table three(a int , b datetime)engine=innodb
    -> partition by range columns (b)(
    -> partition f1 values less than ("2015-01-01"),
    -> partition f2 values less than ("2016-01-01"),
    -> partition f3 values less than ("2017-01-01")
    -> );
Query OK, 0 rows affected (1.23 sec)

mysql>

子分区

字面意思就是在分区的基础上再进行分区,分散数据的存储,也称之为 ` 复合分区`


/*
首先 range  分区 ,在进行 key 的复合分区
*/
create table four(id int , b datetime)
partition by range(year(b))
subpartition by hash(to_days(b))
subpartitions 2(
partition f1 values less than (1999),
partition f2 values less than (2010),
partition f3 values less than maxvalue
);


mysql> create table four(id int , b datetime)
    -> partition by range(year(b))
    -> subpartition by hash(to_days(b))
    -> subpartitions 2(
    -> partition f1 values less than (1999),
    -> partition f2 values less than (2010),
    -> partition f3 values less than maxvalue
    -> );
Query OK, 0 rows affected (1.95 sec)

分区表的维护

查看分区表的信息 在 information_schema 数据库下面的 partitions 表查看分区的信息

/*
就拿上一个例子表 four 举例子,一共六个分区
*/
mysql> select * from information_schema.partitions
    -> where table_name = "four"\G
*************************** 1. row ***************************
                TABLE_CATALOG: def
                 TABLE_SCHEMA: test
                   TABLE_NAME: four
               PARTITION_NAME: f1
            SUBPARTITION_NAME: f1sp0
   PARTITION_ORDINAL_POSITION: 1
SUBPARTITION_ORDINAL_POSITION: 1
             PARTITION_METHOD: RANGE
          SUBPARTITION_METHOD: HASH
         PARTITION_EXPRESSION: year(b)
      SUBPARTITION_EXPRESSION: to_days(b)
        PARTITION_DESCRIPTION: 1999
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 0
                  DATA_LENGTH: 16384
              MAX_DATA_LENGTH: NULL
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP: default
              TABLESPACE_NAME: NULL
*************************** 2. row ***************************
                TABLE_CATALOG: def
                 TABLE_SCHEMA: test
                   TABLE_NAME: four
               PARTITION_NAME: f1
            SUBPARTITION_NAME: f1sp1
   PARTITION_ORDINAL_POSITION: 1
SUBPARTITION_ORDINAL_POSITION: 2
             PARTITION_METHOD: RANGE
          SUBPARTITION_METHOD: HASH
         PARTITION_EXPRESSION: year(b)
      SUBPARTITION_EXPRESSION: to_days(b)
        PARTITION_DESCRIPTION: 1999
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 0
                  DATA_LENGTH: 16384
              MAX_DATA_LENGTH: NULL
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP: default
              TABLESPACE_NAME: NULL
*************************** 3. row ***************************
                TABLE_CATALOG: def
                 TABLE_SCHEMA: test
                   TABLE_NAME: four
               PARTITION_NAME: f2
            SUBPARTITION_NAME: f2sp0
   PARTITION_ORDINAL_POSITION: 2
SUBPARTITION_ORDINAL_POSITION: 1
             PARTITION_METHOD: RANGE
          SUBPARTITION_METHOD: HASH
         PARTITION_EXPRESSION: year(b)
      SUBPARTITION_EXPRESSION: to_days(b)
        PARTITION_DESCRIPTION: 2010
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 0
                  DATA_LENGTH: 16384
              MAX_DATA_LENGTH: NULL
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP: default
              TABLESPACE_NAME: NULL
*************************** 4. row ***************************
                TABLE_CATALOG: def
                 TABLE_SCHEMA: test
                   TABLE_NAME: four
               PARTITION_NAME: f2
            SUBPARTITION_NAME: f2sp1
   PARTITION_ORDINAL_POSITION: 2
SUBPARTITION_ORDINAL_POSITION: 2
             PARTITION_METHOD: RANGE
          SUBPARTITION_METHOD: HASH
         PARTITION_EXPRESSION: year(b)
      SUBPARTITION_EXPRESSION: to_days(b)
        PARTITION_DESCRIPTION: 2010
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 0
                  DATA_LENGTH: 16384
              MAX_DATA_LENGTH: NULL
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP: default
              TABLESPACE_NAME: NULL
*************************** 5. row ***************************
                TABLE_CATALOG: def
                 TABLE_SCHEMA: test
                   TABLE_NAME: four
               PARTITION_NAME: f3
            SUBPARTITION_NAME: f3sp0
   PARTITION_ORDINAL_POSITION: 3
SUBPARTITION_ORDINAL_POSITION: 1
             PARTITION_METHOD: RANGE
          SUBPARTITION_METHOD: HASH
         PARTITION_EXPRESSION: year(b)
      SUBPARTITION_EXPRESSION: to_days(b)
        PARTITION_DESCRIPTION: MAXVALUE
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 0
                  DATA_LENGTH: 16384
              MAX_DATA_LENGTH: NULL
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP: default
              TABLESPACE_NAME: NULL
*************************** 6. row ***************************
                TABLE_CATALOG: def
                 TABLE_SCHEMA: test
                   TABLE_NAME: four
               PARTITION_NAME: f3
            SUBPARTITION_NAME: f3sp1
   PARTITION_ORDINAL_POSITION: 3
SUBPARTITION_ORDINAL_POSITION: 2
             PARTITION_METHOD: RANGE
          SUBPARTITION_METHOD: HASH
         PARTITION_EXPRESSION: year(b)
      SUBPARTITION_EXPRESSION: to_days(b)
        PARTITION_DESCRIPTION: MAXVALUE
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 0
                  DATA_LENGTH: 16384
              MAX_DATA_LENGTH: NULL
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP: default
              TABLESPACE_NAME: NULL
6 rows in set (0.00 sec)

适当使用MySQL 分区 会提高一部分性能


再探黑魔法-Python 生成器


首先提一下lambda

lambda

相当于很小的函数,不需要return

适当使用可以写出更简洁代码结构 和函数的区别:lambda可以写在 列表解析里面,不支持语句的代码块,只允许单个返回值的表达式

lambda 参数1, 参数2……参数n:表达式 (只能一句)

map

对一个可迭代对象中的项,应用一个函数操作

def inc(x): return x + 10


def my_map(func, seq):
	res = []
	for x in seq:
		res.append(func(x))
	return res

	
print list(map(inc, [1, 2, 3]))
print my_map(inc, [1, 2, 3])
print my_map(lambda x: x + 10, [1, 2, 3])

reduce


def my_reduce(func, seq):
	current = seq[0]
	for next in seq[1:]:
		current = func(current, next) # 回调函数
	return current


print my_reduce(lambda x, y: x + y, (1, 2, 3, 4))

迭代器

迭代器协议:对象提供 next 方法,返回迭代中的下一项,直到 迭代完成 引发一个 StopIteration 异常终止迭代, 类似于 游标指针 , 可以记住上次操作结束的位置,下次调用的时候会接着进行操作下一个元素

协议是一种约定,“可迭代对象” (实现了迭代器协议的对象 比如说文件对象 )实现迭代器协议,Python的内置工具(for循环,sum,min,max等)使用迭代器协议访问对象

生成器

生成器是支持迭代协议的对象,该对象提供 ` next 方法,返回迭代中的下一项,直到 迭代完成 引发一个 StopIteration` 异常终止迭代。

在 Python 中,有两种方法可以产生生成器

  1. def+yield 产生一个生成器函数

  2. 用 圆括号 的列表解析”产生一个生成器

In [7]: def test_yield(a):
   ...:     for b in range(a):
   ...:         yield b
   ...:

In [8]: a = test_yield(5)

In [9]: a		# 生成器对象
Out[9]: <generator object test_yield at 0x0000000003C0F3F0>

In [12]: a.next()
Out[12]: 0

In [13]: a.next()
Out[13]: 1

# 生成器方法
# a.close      a.gi_running a.throw
# a.gi_code    a.next
# a.gi_frame   a.send


# 使用 for 循环返回生成器里面的结果
In [8]: for c in test_yield(5):
   ...:     print c
   ...:
0
1
2
3
4

如果值很大的情况下适合使用生成器

生成器表达式的写法:


# 生成器表达式
In [14]: ( a*a for a in range(5) )
Out[14]: <generator object <genexpr> at 0x0000000003D2E900>
# In [15]: list( a*a for a in range(5) )
# Out[15]: [0, 1, 4, 9, 16]


# 列表解析:
In [17]: [ a*a for a in range(5) ]
Out[17]: [0, 1, 4, 9, 16]

生成器的优点

可以用于处理 数据量大的列表

生成器缺点


def percent_total(line_length):
	total_length = sum(line_length)      # 遍历一遍 获取一个总数
	result = []
	for i in line_length:
		line_percent = 100 * i / total_length      # 每一行长度占总长度的百分数 
		result.append(line_percent)      # 添加到 line_percent 列表里面
	return result

# 生成器
def file_line_length(file_name):
	with open(file_name) as f:       # 打开一个文件
		for line in f:
			yield len(line)       # 返回每一行的长度

a = file_line_length('data.txt')
b= percent_total(a)
print(b)



# 演示
In [8]:
   ...: def percent_total(line_length):
   ...:     total_length = sum(line_length) 
   ...:     result = []
   ...:     for i in line_length:
   ...:         line_percent = 100 * i / total_length 
   ...:         result.append(line_percent)    
   ...:     return result
   ...:

In [9]: def file_line_length(file_name):
   ...:     with open(file_name) as f:  
   ...:         for line in f:
   ...:             yield len(line)  
   ...:
   ...:

In [10]: a = file_line_length('data.txt')
    ...: b= percent_total(a)
    ...: print(b)
    ...:
[]

改正

def percent_total(line_length):
	total_length = sum(line_length)      # 遍历一遍 获取一个总数
	result = []
	for i in line_length:
		line_percent = "{0}%".format(100 * i / total_length)      # 每一行长度占总长度的百分数 
		result.append(line_percent)      # 添加到 line_percent 列表里面
	return result

# 生成器
def file_line_length(file_name):
	with open(file_name) as f:       # 打开一个文件
		for line in f:
			yield len(line)       # 返回每一行的长度

a = list(file_line_length('data.txt'))			# 放到 list 里
b= percent_total(a)
print(b)


# 演示
In [54]: def percent_total(line_length):
    ...:     total_length = sum(line_length)
    ...:     result = []
    ...:     for i in line_length:
    ...:         line_percent = "{0}%".format(100 * i / total_length)      
    ...:         result.append(line_percent)     
    ...:     return result
    ...:

In [55]:
    ...: # 生成器
    ...: def file_line_length(file_name):
    ...:     with open(file_name) as f:  
    ...:         for line in f:
    ...:             yield len(line)  
    ...:

In [56]: a = list(file_line_length('data.txt'))

In [57]: a
Out[57]: [6, 11, 1, 3, 1, 3]

In [58]: b= percent_total(a)

In [59]: print b
['24%', '44%', '4%', '12%', '4%', '12%']


Pagination