10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 41.3 mb
PDF (A4)- 41.3 mb
PDF (RPM)- 39.6 mb
HTML下载(TGZ)- 9.3 mb
HTML下载(Zip)- 9.3 mb
HTML下载(RPM)- 7.8 mb
手册(TGZ)- 260.6 kb
手册(Zip)- 371.8 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

15.20.6.1为InnoDB memcached插件改编MySQL模式

考虑以下几个方面memcached当修改现有的MySQL模式或应用程序以使用daemon_memcached插件:

  • memcached键不能包含空格或换行符,因为这些字符在ASCII协议中用作分隔符。如果正在使用包含空格的查找值,在将它们用作调用中的键之前,请将它们转换或哈希为不包含空格的值add ()设置()get (),等等。虽然理论上这些字符在使用二进制协议的程序中的键中是允许的,但是您应该限制键中使用的字符,以确保与广泛的客户机兼容。

  • 如果有一个短的数字主键的列InnoDB表,将其用作的惟一查找键memcached通过将整数转换为字符串值。如果memcached服务器用于多个应用程序,或与多个应用程序InnoDB表中,请考虑修改名称,以确保它是惟一的。例如,在数值之前加上表名,或者数据库名和表名。

    请注意

    daemon_memcached插件支持对映射的插入和读取InnoDB具有整数定义为主键。

  • 不能将分区表用于查询或存储的数据memcached

  • memcached协议将数值作为字符串传递。将数值存储在底层InnoDB表,以实现可以在SQL函数中使用的计数器,如SUM ()AVG (),例如:

    • 使用VARCHAR具有足够的字符以容纳最大期望数的所有数字的列(如果适用于负号、小数点或两者,还需要额外的字符)。

    • 在任何使用列值执行算术的查询中,使用把()函数将值从字符串转换为整数或其他数值类型。例如:

      #字母条目返回为零。SELECT CAST(c2 as unsigned integer) FROM demo_test;#因为可能有0的数值,不能取消它们的资格。#测试字符串值,找出整数,并只对它们求平均值。SELECT AVG(cast(c2 as unsigned integer)) FROM demo_test WHERE c2 BETWEEN '0' and '9999999999';#视图让你隐藏查询的复杂性。结果已经被转换;#不需要每次重复转换函数和WHERE子句。CREATE VIEW numbers AS SELECT c1 KEY, CAST(c2 AS UNSIGNED INTEGER) val FROM demo_test WHERE c2 BETWEEN '0' and '9999999999';SELECT SUM(val) FROM numbers;
      请注意

      调用将结果集中的任何字母值转换为0把().当使用函数时,如AVG (),它取决于结果集中的行数,包括在哪里子句过滤掉非数字值。

  • 如果InnoDB用作键的列的值可以大于250字节,将值哈希到小于250字节。

  • 方法使用现有表daemon_memcached插件中为其定义一个条目innodb_memcache.containers表格将该表设为所有表的默认值memcached请求时,指定值默认的的名字列,然后重新启动MySQL服务器使更改生效。的不同类使用多个表memcached数据,设置多个条目innodb_memcache.containers的名字您所选择的值,然后发出一个memcached的形式的请求得到@@的名字设置@@的名字在应用程序中指定要用于后续操作的表memcached请求。

    下面是使用预定义表以外的表的示例test.demo_test表,请参阅例15.13“使用InnoDB memcached应用程序使用自己的表”.有关所需的表布局,请参见“InnoDB memcached插件内部程序”第15.20.8节

  • 要使用多个InnoDB表列值memcached的键值对中指定用逗号、分号、空格或管道字元分隔的列名value_columns的字段innodb_memcache.containers的入口InnoDB表格例如,指定col1, col2 col3col1 | col2 | col3value_columns字段。

    在将字符串传递到之前,使用管道字符作为分隔符将列值连接到单个字符串memcached添加调用。字符串会自动解压缩到正确的列中。每一个得到调用返回一个字符串,该字符串包含同样由管道字符分隔的列值。可以使用适当的应用程序语言语法解包这些值。

例15.13使用InnoDB memcached应用程序使用自己的表

这个例子展示了如何使用您自己的表和示例Python应用程序memcached用于数据操作。

该示例假设daemon_memcached插件的安装如第15.20.3节“设置InnoDB memcached Plugin”.它还假设您的系统被配置为运行使用python-memcache模块。

  1. 创建multicol表,其中存储国家信息,包括人口、面积和司机侧数据(“R”对于权利和“L”左)。

    mysql>使用测试;mysql> CREATE TABLE ' multicol ' (' country ' varchar(128) NOT NULL DEFAULT ", ' population ' varchar(10) DEFAULT NULL, ' area_sq_km ' varchar(9) DEFAULT NULL, ' drive_side ' varchar(1) DEFAULT NULL, ' c3 ' int(11) DEFAULT NULL, ' c4 ' bigint(20) unsigned DEFAULT NULL, ' c5 ' int(11) DEFAULT NULL, PRIMARY KEY (' country ')) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  2. 中插入一条记录innodb_memcache.containers表,以便daemon_memcached插件可以访问multicol表格

    INSERT INTO innodb_memcache。containers (name,db_schema,db_table,key_columns,value_columns,flags,cas_column, expire_time_column,unique_idx_name_on_key) VALUES ('bbb','test','multicol','country','population,area_sq_km,drive_side', 'c3','c4','c5','PRIMARY');mysql >提交;
    • innodb_memcache.containers记录multicol表指定了的名字的价值“bbb”,它是表标识符。

      请注意

      如果一个人InnoDB表用于所有memcached应用程序,的名字值可设置为默认的避免使用@@转换表的符号。

    • db_schema列设置为测验的数据库名称multicol表驻留。

    • db_table列设置为multicol的名称InnoDB表格

    • key_columns设置为唯一国家列。的国家控件中的主键定义为multicol表定义。

    • 而不是单一的InnoDB表列保存复合数据值,数据被划分到三个表列中(人口area_sq_km,drive_side).中指定以逗号分隔的列列表以容纳多个值列value_columns字段。中定义的列value_columns字段是存储或检索值时使用的列。

    • 的值旗帜expire_time,cas_column类中使用的值为基础demo.test示例表。类的应用程序中,这些字段通常不重要daemon_memcached因为MySQL保持数据同步,不需要担心数据过期或过时。

    • unique_idx_name_on_key字段设置为主要的,它引用在惟一值上定义的主索引国家列中的multicol表格

  3. 将示例Python应用程序复制到一个文件中。在本例中,示例脚本被复制到一个名为multicol.py

    示例Python应用程序将数据插入multicol表并检索所有键的数据,演示如何访问InnoDB表通过daemon_memcached插件。

    import sys, os import memcache def connect_to_memcached(): memc = memcache. client (['127.0.0.1:11211'], debug=0);返回memc def banner(message):打印打印" = " * len(消息)打印消息打印" = " * len(消息)country_data =[(“加拿大”、“34820000”、“9984670”、“R”),(“美国”、“314242000”、“9826675”、“R”),(“爱尔兰”、“6399152”、“84421”、“L”),(“英国”、“62262000”、“243610”、“L”),(“墨西哥”、“113910608”、“1972550”、“R”),(“丹麦”、“5543453”、“43094”、“R”),(“挪威”、“5002942”、“385252”、“R”),(“阿联酋”,“8264070”,“83600”,“R”),(“印度”、“1210193422”、“3287263”、“L”),(“中国”、“1347350000”、“9640821”、“R”),]def switch_table (memc、表):关键  = "@@" + 表打印”切换默认表”表“+ +”通过发行得到“+键+”。”结果= memc.get(关键)def insert_country_data (memc):横幅(“通过memcached接口插入初始数据”)的项目country_data:国家=人口项目[0]=[1]项面积=项目[2]drive_side =项目[3]键=国家值= " | " . join([人口、面积、drive_side])打印”键= " +键打印“价值= " +值如果memc.add(键,值):打印“添加新键值对。”:memc.set(key,value) def query_country_data(memc): banner("检索所有键(国家名)的数据")为项目在country_data: key =项目[0]结果= memc.get(key)打印"这里是从数据库检索的结果为键" +键+ ":"打印结果(m_population, m_area, m_drive_side) = result.split("|")打印"未包装的人口值:" + m_population打印"未包装的区域值:" + m_area打印"未包装的驱动器侧值:+ m_drive_side if __name__ == '__main__': memc = connect_to_memcached() switch_table(memc,"bbb") insert_country_data(memc) query_country_data(memc) sys.exit(0)

    示例Python应用程序说明:

    • 运行应用程序不需要数据库授权,因为数据操作是通过memcached接口。所需的惟一信息是本地系统上的端口号memcached守护进程听。

    • 来确保应用程序使用multicol表,switch_table ()函数被调用,该函数执行一个虚拟得到请求使用@@符号。的的名字请求中的值为bbb,即multicol中定义的表标识符innodb_memcache.containers.name字段。

      更有描述性的的名字值可能在实际应用程序中使用。中指定的是表标识符,而不是表名得到@@……请求。

    • 用于插入和查询数据的实用函数演示了如何将Python数据结构转换为管道分隔的值,以便将数据发送到MySQL添加方法返回的管道分隔的值,以及如何解包得到请求。此额外处理仅在映射单个memcached值到多个MySQL表列。

  4. 运行示例Python应用程序。

    Shell > python multi - col.py

    如果成功,示例应用程序返回以下输出:

    连接到memcached。通过为'@@bbb'发出GET,将默认表切换到'bbb'。============================================== 通过memcached插入初始数据接口  ============================================== R键=加拿大值= 34820000 | 34820000 |添加新键,值对。Key = USA Value = 314242000|9826675|R新增Key、Value对。Key = Ireland Value = 6399152|84421|L新增Key、Value对。Key = UK Value = 62262000|243610|L新增Key、Value对。Key = Mexico Value = 113910608|1972550|R新增Key、Value对。Key = Denmark Value = 5543453|43094|R添加新的Key,值对。Key = Norway Value = 5002942|385252|R增加新的Key、值对。Key = UAE Value = 8264070|83600|R新增Key、Value对。 Key = India Value = 1210193422|3287263|L Added new key, value pair. Key = China Value = 1347350000|9640821|R Added new key, value pair. ============================================ Retrieving data for all keys (country names) ============================================ Here is the result retrieved from the database for key Canada: 34820000|9984670|R Unpacked population value: 34820000 Unpacked area value : 9984670 Unpacked drive side value: R Here is the result retrieved from the database for key USA: 314242000|9826675|R Unpacked population value: 314242000 Unpacked area value : 9826675 Unpacked drive side value: R Here is the result retrieved from the database for key Ireland: 6399152|84421|L Unpacked population value: 6399152 Unpacked area value : 84421 Unpacked drive side value: L Here is the result retrieved from the database for key UK: 62262000|243610|L Unpacked population value: 62262000 Unpacked area value : 243610 Unpacked drive side value: L Here is the result retrieved from the database for key Mexico: 113910608|1972550|R Unpacked population value: 113910608 Unpacked area value : 1972550 Unpacked drive side value: R Here is the result retrieved from the database for key Denmark: 5543453|43094|R Unpacked population value: 5543453 Unpacked area value : 43094 Unpacked drive side value: R Here is the result retrieved from the database for key Norway: 5002942|385252|R Unpacked population value: 5002942 Unpacked area value : 385252 Unpacked drive side value: R Here is the result retrieved from the database for key UAE: 8264070|83600|R Unpacked population value: 8264070 Unpacked area value : 83600 Unpacked drive side value: R Here is the result retrieved from the database for key India: 1210193422|3287263|L Unpacked population value: 1210193422 Unpacked area value : 3287263 Unpacked drive side value: L Here is the result retrieved from the database for key China: 1347350000|9640821|R Unpacked population value: 1347350000 Unpacked area value : 9640821 Unpacked drive side value: R
  5. 查询innodb_memcache.containers表来查看您先前为multicol表格的示例条目demo_test初始化过程中创建的daemon_memcached插件设置。第二个记录是您为multicol表格

    SELECT * FROM innodb_memcache。集装箱\G *************************** 1;行  *************************** 名称:aaa db_schema:测试db_table: demo_test key_columns: c1 value_columns: c2旗帜:c3 cas_column: c4 expire_time_column: c5 unique_idx_name_on_key:初选  *************************** 2。row *************************** name: bbb db_schema: test db_table: multicol key_columns: country value_columns: population,area_sq_km,drive_side flags: c3 cas_column: c4 expire_time_column: c5 unique_idx_name_on_key: PRIMARY
  6. 查询multicol表查看示例Python应用程序插入的数据。该数据可用于MySQL查询,它演示了如何使用SQL或通过应用程序(使用适当的MySQL连接器或API).

    SELECT * FROM test.multicol;+---------+------------+------------+------------+------+------+------+ | 国家人口| | area_sq_km | drive_side | c3 | c4 | c5  | +---------+------------+------------+------------+------+------+------+ | 加拿大| 34820000 | 34820000 | 11 R | 0 | | 0 | |中国| 1347350000 | 1347350000 | 20 R | 0 | | 0 | |丹麦| 43094 | 5543453 | 16 R | 0 | | 0 | |印度| 1210193422 | 1210193422 | 19 L | 0 | | 0 | |爱尔兰| 84421 | 6399152 | 13 L | 0 | | 0 | |墨西哥| 113910608 | 113910608 | 15 R | 0 | | 0||Norway | 5002942 | 385252 | R | 0 | 17 | 0 | | UAE | 8264070 | 83600 | R | 0 | 18 | 0 | | UK | 62262000 | 243610 | L | 0 | 14 | 0 | | USA | 314242000 | 9826675 | R | 0 | 12 | 0 | +---------+------------+------------+------------+------+------+------+
    请注意

    在定义被视为数字的列的长度时,始终允许有足够的大小来容纳必要的数字、小数点、符号字符、前导零等。字符串列中的值太长,例如VARCHAR通过删除一些字符来截断,这可能会产生无意义的数值。

  7. 控件上运行报告类型查询(可选)InnoDB表,该表存储memcached数据。

    您可以通过SQL查询生成报告,跨任何列执行计算和测试,而不仅仅是列国家键列。(因为下面的例子只使用了几个国家的数据,所以这些数字仅用于说明。)下面的查询返回人们靠右开车的国家的平均人口,以及名称以字母开头的国家的平均面积U

    SELECT AVG(population) FROM multicol WHERE drive_side = 'R';+-------------------+ | avg(人口 ) | +-------------------+ | 261304724.7142857  | +-------------------+ mysql >选择总和(area_sq_km)从multicol国家像“U %”;+-----------------+ | sum (area_sq_km ) | +-----------------+ | 10153885  | +-----------------+

    因为人口而且area_sq_km列存储字符数据,而不是强类型的数值数据,例如函数AVG ()而且SUM ()首先将每个值转换为数字。这种方法不工作对于诸如<>,例如,在比较基于字符的值时,9 > 1000,这是不应该出现在诸如按人口排序.要获得最精确的类型处理,请对将数值列转换为适当类型的视图执行查询。这种技术可以让您的问题变得简单SELECT *来自数据库应用程序的查询,同时确保类型转换、筛选和排序正确。下面的示例显示了一个视图,可以查询该视图以查找按人口降序排列的前三个国家,其结果反映了最新的数据multicol表格,以人口和地区数字作为数字处理:

    mysql> CREATE VIEW populous_nations AS SELECT country, cast(population AS unsigned integer) population, cast(area_sq_km AS unsigned integer) area_sq_km, drive_side FROM multicol ORDER BY cast(population AS unsigned integer) DESC LIMIT 3;SELECT * FROM populous_countries;+---------+------------+------------+------------+ | 国家人口| | area_sq_km | drive_side  | +---------+------------+------------+------------+ | 印度R中国| 1347350000 | 1347350000 | | | | 1210193422 | 1210193422 | L | |美国| 314242000 | 314242000 | R  | +---------+------------+------------+------------+ mysql > DESC populous_countries;+------------+---------------------+------+-----+---------+-------+ | 字段默认零关键| | | | |类型多  | +------------+---------------------+------+-----+---------+-------+ | 国家| varchar(128) |不  | | | | | 人口|长整型数字(10)无符号|是| |零| | | area_sq_km | int(9)无符号|是| |零| | | drive_side | varchar(1) |是| | NULL  | | +------------+---------------------+------+-----+---------+-------+