1) 所有的“对象”都在它自qtable中,没有冗余?br>2) 数据库通常由E-R囄成?br>3) z,更新属性通常只需要更新很的记录?br>4) Join操作比较耗时?br>5) SelectQsort优化措施比较?yu)?br>6) 适用于OLTP应用?br>非标准化的特点:(x)
1) 在一张表中存储很多数据,数据冗余?br>2) 更新数据开销很大Q更C个属性可能会(x)更新很多表,很多记录?br>3) 在删除数据是有可能丢失数据?br>4) SelectQorder有很多优化的选择?br>5) 适用于DSS应用?br>
1) 对OLTP使用标准化,对DSS使用非标准化2.1.2 数据cd
2) 使用物化视图。MySQL不直接支持该数据库特性,但是可以用MyISAM表代ѝ?br>3) 冗余一些数据在表格中,例如ref_id和name存在同一张表中。但是要注意更新问题?br>4) 对于一些简单的对象Q直接用value作ؓ(f)建。例如IP address{?br>5) Reference by PRIMARY/UNIQUE KEY。MySQL可以优化q种操作Q例如:(x)
java 代码
- select city_name
- from city,state
- where state_id=state.id and state.code=‘CA’” converted to “select city_name from city where state_id=12
1) 使用正确合适的cdQ不要将数字存储为字W串?br>2) 可能地使用最有效(最?的数据类型。MySQL有很多节省磁盘空间和内存的专业化cd?br>3) 可能用较?yu)的整数cd使表更小。例如,MEDIUMINTl常比INT好一些,因ؓ(f)MEDIUMINT列用的I间要少25%?br>4) 如果可能Q声明列为NOT NULL。它使Q何事情更快而且每列可以节省一位。注意如果在应用E序中确实需要NULLQ应该毫无疑问用它Q只是避?默认地在所有列上有它?br>5) 对于MyISAM表,如果没有M变长?VARCHAR、TEXT或BLOB?Q用固定尺寸的记录格式。这比较快但是不q地可能?x)浪费一些空间。即使你已经用CREATE选项让VARCHAR?span class=hilite1>ROW_FORMAT=fixedQ也可以提示想用固定长度的行?br>6) 使用sample character setQ例如latin1。尽量少使用utf-8Q因为utf-8占用的空间是latin1?倍。可以在不需要用utf-8的字D上面用latin1Q例如mailQurl{?br>
1) MySQL只会(x)使用前缀Q例如key(a, b) …where b=5 用不到烦(ch)引?br>2) 要选择性的使用索引。在变化很少的列上用烦(ch)引ƈ不是很好Q例如性别列?br>3) 在Unique列上定义Unique index?br>4) 避免建立使用不到的烦(ch)引?br>5) 在Btree index中(InnoDB使用BtreeQ,可以在需要排序的列上建立索引?br>6) 避免重复的烦(ch)引?br>7) 避免在已有烦(ch)引的前缀上徏立烦(ch)引。例如:(x)如果存在indexQaQbQ则LindexQaQ?br>8) 控制单个索引的长度。用keyQnameQ?Q)(j)在数据的前面几个字符建立索引?br>9) 是短的键D好,最好用integer?br>10) 在查询中要用到索引Q用explain查看Q,可以减少ȝ盘的ơ数Q加速读取数据?br>11) 相近的键值比随机好。Auto_increment比uuid好?br>12) Optimize table可以压羃和排序indexQ注意不要频J运行?br>13) Analyze table可以更新数据?br>2.2 Designing queries
1) 在有index的情况下Q尽量保证查询用了(jin)正确的index。可以用EXPLAIN select …查看l果Q分析查询?br>2) 查询时用匹配的cd。例如select * from a where id=5Q?如果q里id是字W类型,同时有indexQ这条查询则使用不到indexQ会(x)做全表扫描,速度?x)很慢。正的应该?… where id=”5” Q加上引可明类型是字符?br>3) 使用--log-slow-queries –long-query-time=2查看查询比较慢的语句。然后用explain分析查询Q做Z化?br>3. 服务器端优化
--character-setQ如果是单一语言使用单的character set例如latin1。尽量少用Utf-8Qutf-8占用I间较多?br>--memlockQ锁定MySQL只能q行在内存中Q避免swappingQ但是如果内存不够时有可能出现错误?br>--max_allowed_packetQ要_大,以适应比较大的SQL查询Q对性能没有太大影响Q主要是避免出现packet错误?br>--max_connectionsQserver允许的最大连接。太大的话会(x)出现out of memory?br>--table_cacheQMySQL在同一旉保持打开的table的数量。打开table开销比较大。一般设|ؓ(f)512?br>--query_cache_sizeQ?用于~存查询的内存大?br>--datadirQmysql存放数据的根目录Q和安装文g分开在不同的盘可以提高一Ҏ(gu)能?br>4. 存储引擎优化
1) 不支持事务,宕机?x)破坏?br>2) 使用较小的内存和盘I间4.1.1.2 Typical MyISAM usages
3) Z表的锁,q发更新数据?x)出C重性能问题
4) MySQL只缓存I(y)ndexQ数据由O(jin)S~存
1) 日志pȝ4.1.2 MyISAM优化要点
2) 只读或者绝大部分是L作的应用
3) 全表扫描
4) 扚w导入数据
5) 没有事务的低q发??br>
1) 声明列ؓ(f)NOT NULLQ可以减磁盘存储?br>2) 使用optimize table做碎片整理,回收I闲I间。注意仅仅在非常大的数据变化后运行?br>3) Deleting/updating/adding大量数据的时候禁止用index。用ALTER TABLE t DISABLE KEYS?br>4) 讄myisam_max_[extra]_sort_file_size_大,可以显著提高repair table的速度?br>4.1.3 MyISAM Table Locks
1) 避免q发insertQupdate?br>2) 可以使用insert delayedQ但是有可能丢失数据?br>3) 优化查询语句?br>4) 水^分区?br>5) 垂直分区?br>6) 如果都不起作用,使用InnoDB?br>4.1.4 MyISAM Key Cache
1) 讄key_buffer_size variable。MyISAN最主要的cache讄Q用于缓存MyISAM表格的index数据Q该参数只对MyISAM有媄(jing)响。通常在只使用MyISAM的Server中设|?5-33%的内存大?br>2) 可以使用几个不同的Key CachesQ对一些hot dataQ?br>a) SET GLOBAL test.key_buffer_size=512*1024;2) Preload index到Cache中可以提高查询速度。因为preloading index是顺序的Q所以非常快?br>
b) CACHE INDEX t1.i1, t2.i1, t3 IN test;a) LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVESQ?br>
1) 支持事务QACIDQ外键?br>2) Row level locks?4.2.1.2 InnoDB Good For
3) 支持不同的隔ȝ别?br>4) 和MyISAM相比需要较多的内存和磁盘空间?br>5) 没有键压~?br>6) 数据和烦(ch)引都~存在内存hash表中?br>
1) 需要事务的应用?br>2) 高ƈ发的应用?br>3) 自动恢复?br>4) 较快速的Z主键的操作?br>4.2.2 InnoDB优化要点
1) 量使用shortQinteger的主键?br>2) Load/Insert数据时按主键序。如果数据没有按主键排序Q先排序然后再进行数据库操作?br>3) 在Load数据是ؓ(f)讄SET UNIQUE_CHECKS=0QSET FOREIGN_KEY_CHECKS=0Q可以避免外键和唯一性约束检查的开销?br>4) 使用prefix keys。因为InnoDB没有key压羃功能?br>4.2.3 InnoDB服务器端讑֮
innodb_buffer_pool_sizeQ这是InnoDB最重要的设|,对InnoDB性能有决定性的影响。默认的讄只有8MQ所以默认的数据库设|下面InnoDB性能很差。在只有InnoDB存储引擎的数据库服务器上面,可以讄60-80%的内存。更_一点,在内存容量允许的情况下面讄比InnoDB tablespaces?0%的内存大?br>5. ~存
innodb_data_file_pathQ指定表数据和烦(ch)引存储的I间Q可以是一个或者多个文件。最后一个数据文件必L自动扩充的,也只有最后一个文件允许自动扩充。这P当空间用完后Q自动扩充数据文件就?x)自动增长(?MB为单位)(j)以容U额外的数据。例如:(x) innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend两个数据文g攑֜不同的磁盘上。数据首先放在ibdata1中,当达?00M以后Q数据就攑֜ibdata2中。一旦达?0MBQibdata2以8MB为单位自动增ѝ如果磁盘满?jin),需要在另外的磁盘上面增加一个数据文件?br>
innodb_data_home_dirQ放|表I间数据的目录,默认在mysql的数据目录,讄到和MySQL安装文g不同的分区可以提高性能?br>
innodb_log_file_sizeQ该参数军_?jin)recovery speed。太大的话recovery׃(x)比较慢,太小?jin)?jing)响查询性能Q一般取256M可以兼顾性能和recovery的速度
?br>innodb_log_buffer_sizeQ磁盘速度是很慢的Q直接将log写道盘?x)?jing)响InnoDB的性能Q该参数讑֮?jin)log buffer的大,一?M。如果有大的blob操作Q可以适当增大?br>
innodb_flush_logs_at_trx_commit=2Q?该参数设定了(jin)事务提交时内存中log信息的处理?br>1) =1Ӟ在每个事务提交时Q日志缓冲被写到日志文gQ对日志文g做到盘操作的刷新。Truly ACID。速度慢?br>2) =2Ӟ在每个事务提交时Q日志缓冲被写到文gQ但不对日志文g做到盘操作的刷新。只有操作系l崩溃或掉电(sh)才会(x)删除最后一U的事务Q不然不?x)丢׃务?br>3) =0Ӟ 日志~冲每秒一ơ地被写到日志文Ӟq且Ҏ(gu)志文件做到磁盘操作的h。Q何mysqldq程的崩溃会(x)删除崩溃前最后一U的事务innodb_file_per_tableQ可以存储每个InnoDB表和它的索引在它自己的文件中?br>
transaction-isolation=READ-COMITTED: 如果应用E序可以q行在READ-COMMITED隔离U别Q做此设定会(x)有一定的性能提升?br>
innodb_flush_methodQ?讄InnoDB同步IO的方式:(x)
1) Default – 使用fsyncQ)(j)?br>2) O_SYNC 以sync模式打开文gQ通常比较慢?br>3) O_DIRECTQ在Linux上用Direct IO。可以显著提高速度Q特别是在RAIDpȝ上。避免额外的数据复制和double bufferingQmysql buffering 和OS bufferingQ?br>innodb_thread_concurrencyQ?InnoDB kernel最大的U程数?br>1) 最设|ؓ(f)(num_disks+num_cpus)*2?br>2) 可以通过讄?000来禁止这个限?br>
?
例子1、和UNITS合用Q指定日期或旉单位(year,month,day,hour,minute,seond,fraction)Q?
let tmp_date = today + 3 UNITS day
例子2、let tmp_date = MDY(10,30,2002) -- 2002-10-30
例子3、let tmp_date = today + interval(7) day to day --当前旉加上7天;
注:(x)该功能与1怼Q?
例子4、EXTEND转换日期或日期时间?
let tmp_inthour = extend(datetime1,hour to hour)
3、代数函?
1QABS(COLNAME/EXPRESSION)Q 取绝对?
2QMODQCOLNAME/EXPRESSIONQDIVISORQ q回除以除数后的模(余数Q?
3QPOWQCOLNAME/EXPRESSIONQEXPONENTQ q回一个值的指数?
例子Qlet tmp_float = pow(2,3) --8.00000000
4QROOTQCOLNAME/EXPRESSIONQ[index]Q q回指定列或表达式的根?
5QSQRTQCOLNAME/EXPRESSIONQ q回指定列或表达式的qx根?
6QROUNDQCOLNAME/EXPRESSIONQ[factor]Q?q回指定列或表达式的圆整化?
7QTRUNCQCOLNAME/EXPRESSIONQ[factor]Q?q回指定列或表达式的截尾?
说明Q上两者中FACTOR指定数位数Q若不指定,则ؓ(f)0Q若敎ͼ则整化到数点左边;
注:(x)ROUND是在指定位上q行4?入;TRUNC是在指定位上直接截断Q?
let tmp_float = round(4.555,2) --4.56
let tmp_float = trunc(4.555,2) --4.55
4、指CҎ(gu)函数
1QEXPQCOLNAME/EXPRESSIONQ q回指定列或表达式的指数?
2QLOGNQCOLNAME/EXPRESSIONQ q回指定列或表达式的自然Ҏ(gu)?
3QLOG10QCOLNAME/EXPRESSIONQ q回指定列或表达式的底数?0的对数?
5、三角函?
1QCOSQRADIAN EXPRESSIONQ q回指定弧度表达式的余u?
2QSINQRADIAN EXPRESSIONQ 正u
3QTANQRADIAN EXPRESSIONQ 正切
4QACOSQRADIAN EXPRESSIONQ 反余?
5QASINQRADIAN EXPRESSIONQ 反正?
6QATANQRADIAN EXPRESSIONQ 反正?
7QATAN2QXQYQ q回坐标QXQYQ的极坐标角度组?
6、统计函?
1QRANGEQCOLNAMEQ q回指定列的最大g最g?= MAXQCOLNAMEQ?MIN
QCOLNAMEQ?
2QVARIANCEQCOLNAMEQ q回指定列的h方差Q?
3QSTDEVQCOLNAMEQ q回指定列的标准偏差Q?
7、其他函?
1QUSER q回当前用户?
2QHEXQCOLNAME/EXPRESSIONQ q回指定列或表达式的十六q制?
3QLENGTHQCOLNAME/EXPRESSIONQ q回指定字符列或表达式的长度
4QTRIMQCOLNAME/EXPRESSIONQ 删除指定列或表达式前后的字符
5QCOLNAME/EXPRESSION || COLNAME/EXPRESSION q回q在一L(fng)字符Q?
二、IDS内部函数
1、DBSERVERNAME q回数据库服务器名 let tmp_char=DBSERVERNAME
2、SITENAME q回数据库服务器名 let tmp_char=SITENAME
说明Q两者功能相同;
3、DBINFOQ‘SPECIAL_KEYWORD') q回只关键字?
例子1Q返回数据中每个表的DBSPACE名称
select dbinfo('dbspace',partnum),tabname from systables
where tabid>99 and tabtype='T' (OK)
例子2Q返回Q何表中插入的最后一个SERIAL?
select dbinfo('sqlca.sqlerrd1') from systables where tabid = 1
例子3Q返回最后一个SELECTQINSERTQUPDATEQDELETE或EXECUTE PROCEDURE语句处理的行敎ͼ
select dbinfo('sqlca.sqlerrd2') from systables where tabid=1;
(tng)
One of the more difficult concepts in Informix's handling of date and time values concerns the use of the variables in arithmetic or relational expressions. You can add or subtract DATE and DATETIME variables from each other. You can add or subtract an INTERVAL to a DATE or DATETIME. Table 1 shows the results of different types of operations on DATE and DATETIME values.
Table 1. Operations on DATE and DATETIME Variables
First Operand |
Operation |
Second Operand |
Result |
DATE |
- |
DATETIME |
INTERVAL |
DATETIME |
- |
DATE |
INTERVAL |
DATE |
+- |
INTERVAL |
DATETIME |
DATETIME |
- |
DATETIME |
INTERVAL |
DATETIME |
+- |
INTERVAL |
DATETIME |
INTERVAL |
+ |
DATETIME |
DATETIME |
INTERVAL |
+- |
INTERVAL |
INTERVAL |
DATETIME |
- |
CURRENT |
INTERVAL |
CURRENT |
- |
DATETIME |
INTERVAL |
INTERVAL |
+ |
CURRENT |
DATETIME |
CURRENT |
+- |
INTERVAL |
DATETIME |
DATETIME |
+- |
UNITS |
DATETIME |
INTERVAL |
+- |
UNITS |
INTERVAL |
INTERVAL |
*/ |
NUMBER |
INTERVAL |
Notice that it's always okay to subtract one DATE or DATETIME value from another, as shown here: In such a case, the result is always an INTERVAL variable. It would make no sense to add two DATE or DATETIME values together. What could such an addition represent? When working with INTERVAL values, sometimes it is necessary to specify the precision with which you are dealing. For example, suppose you have the following field defined: To add 10 days to the lead time you could use a SQL statement like this: You could achieve the same results using the UNITS keyword: Like most other programming languages, SQL often allows you to achieve the same ends with different statements. Sometimes the choice is one of personal style. Other times, one format fits in better with a structured style of code writing than another format does. There are several built-in functions that affect date and time calculations. They can apply to either DATE or DATETIME values, with some exceptions. The TODAY function returns a DATE data value representing the current date. For example, you could execute a SQL function like this: The CURRENT function is similar to the TODAY function, except it returns a DATETIME value. Without specific qualifiers, the default is YEAR to FRACTION(3). You can change the precision by using the same YEAR to FRACTION qualifiers as you use for DATETIMES. Thus, this would be legal: The DATE function takes as input a non-DATE value such as CHAR, DATETIME, or INTEGER and returns the corresponding DATE value. For example, the following SQL translates a CHARACTER value to a DATE: This function returns an integer representing the day of the month. Here's an example: This performs like the DAY function except it returns an integer between 1 and 12 representing the month: This returns an integer representing the day of the week, with 0 being Sunday and 6 being Saturday: This function is like the ones above, only it returns a four-digit integer representing the year. This function allows you to use different precisions in a DATETIME than you have specified in the declaration of the variable. It uses the same FIRST to LAST syntax as the DATETIME variables. This function is used to adjust the precision of a DATETIME variable to match the precision of an INTERVAL that you are using in a calculation. If the INTERVAL value has fields that are not part of the DATETIME value that you are using in a calculation, use the EXTEND function to adjust the precision of the DATETIME. EXTEND can either increase or decrease the precision of a DATETIME, depending upon the FIRST and LAST values. Suppose myvariable is declared as DATETIME YEAR to DAY. If you want to add or subtract an INTERVAL defined as MINUTE, you first have to extend the DATETIME as follows: The resulting value will be DATETIME YEAR to MINUTE. The MDY function converts three-integer values into a DATE format. The first integer is the month and must evaluate to an integer in the range 1?2. The second integer is the day and must evaluate to a number in the range from 1 to however many days are in the particular month (28?1). The third expression is the year and must be a four-digit integer. Thus, the following MDY functions would each be valid: returns a DATE of "07/01/50" returns a DATE equal to the first day of the current month in the current year Informix has extensive capabilities for manipulating dates and times, which can make for long and complex SQL statements. Using the three time-related data types and the time-related functions and keywords, you can accomplish almost any type of manipulation of time data. Unfortunately, getting there may be cryptic and painful. If you regularly do extensive date and time manipulation, you should understand all of the intricacies of these data structures.
Have fun! (tng)CURRENT - "07/01/1950" = INTERVAL (my age)
"12/25/2000" ?CURRENT = INTERVAL (how long till Xmas?)
UNITS Keyword
lead_time INTERVAL DAY to DAY
SELECT lead_time + INTERVAL(10) DAY to DAY
FROM orders
SELECT lead_time + 10 UNITS DAY
FROM orders
Functions
TODAY
UPDATE member SET change_date = TODAY
WHER member_number = 12345
CURRENT
SELECT * from member
WHERE elapsed_time < CURRENT YEAR to DAY
DATE
SELECT * from member
WHERE enrollment_date > DATE('01/01/99')
DAY
SELECT * from member
WHERE DAY(enrollment_date) > DAY(CURRENT)
MONTH
SELECT * from member
WHERE enrollment_date > MONTH('01/01/99')
WEEKDAY
SELECT * from member
WHERE WEEKDAY(enrollment_date) > WEEKDAY(CURRENT)
YEAR
EXTEND
SELECT EXTEND(myvariable, YEAR to MINUTE) ?
INTERVAL(5) MINUTE to MINUTE
FROM member
MDY
MDY(7,1,1950)
MDY(MONTH(TODAY), 1, YEAR(TODAY))
(tng)