MySQL ORDER BY主键id加LIMIT限制走错索引

栏目: 数据库 · 发布时间: 6年前

内容简介:CREATE TABLE `report_product_sales_data` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`hq_code` char(16) COLLATE utf8_unicode_ci NOT NULL COMMENT '公司编码',

背景及现象

  • report_product_sales_data表数据量2800万;
  • 经测试,在当前数据量情况下,order by主键id,limit最大到49的时候可以用到索引report_product_sales_data_hq_code_orgz_id_index,大于49时就走PRIMARY主键索引。

表结构

CREATE TABLE `report_product_sales_data` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',

`hq_code` char(16) COLLATE utf8_unicode_ci NOT NULL COMMENT '公司编码',

`product_id` int(10) unsigned NOT NULL COMMENT '商品ID',

`orgz_id` int(10) unsigned NOT NULL COMMENT '组织ID',

`sales_num` double(16,3) NOT NULL COMMENT '销售数量',

`report_date` date NOT NULL COMMENT '报表日期',

`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态: 0.未日结,1.已日结',

`created_at` timestamp NULL DEFAULT NULL,

`updated_at` timestamp NULL DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `report_product_sales_data_unique` (`hq_code`,`report_date`,`orgz_id`,`product_id`),

KEY `report_product_sales_data_hq_code_orgz_id_index` (`hq_code`,`orgz_id`,`report_date`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='商品日营业数据表';

Explain命令查看执行计划

-- 批量查询耗时154ms

select product_id, sales_num, report_date from `report_product_sales_data`

where `hq_code` = '000030'

and `orgz_id` = 229

and `product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)

and `report_date` > '2018-05-11' order by id desc

limit 320;

-- explain结果如下

id  select_type table  type    possible_keys  key key_len ref rows    Extra

1  SIMPLE  report_product_sales_data  range  report_product_sales_data_unique,report_product_sales_data_hq_code_orgz_id_index    report_product_sales_data_hq_code_orgz_id_index 55  NULL    37088  Using index condition; Using where; Using filesort-- 批量查询耗时397ms

select product_id, sales_num, report_date from `report_product_sales_data`

where `hq_code` = '000030'

and `orgz_id` = 229

and `product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)

and `report_date` > '2018-05-11'

order by `id` desc limit 10;

-- explain结果如下

id  select_type table  type    possible_keys  key key_len ref rows    Extra

1  SIMPLE  report_product_sales_data  index  report_product_sales_data_unique,report_product_sales_data_hq_code_orgz_id_index    PRIMARY 4  NULL    7624    Using where

开启优化器跟踪查看 MySQL 优化过程

-- 开启优化器跟踪

set session optimizer_trace='enabled=on';

-- 在执行完查询语句后,在执行以下的select语句可以查看具体的优化器执行过程

select * from information_schema.optimizer_trace;-- 对于这条走了预期report_product_sales_data_hq_code_orgz_id_index索引的查询,我们看下优化器的执行过程

select product_id, sales_num, report_date from `report_product_sales_data`

where `hq_code` = '000030'

and `orgz_id` = 229

and `product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)

and `report_date` > '2018-05-11' order by id desc

limit 320;-- 看下trace部分

{

"steps": [

{

"join_preparation": {

"select#": 1,

"steps": [

{

"expanded_query": "/* select#1 */ select `report_product_sales_data`.`product_id` AS `product_id`,`report_product_sales_data`.`sales_num` AS `sales_num`,`report_product_sales_data`.`report_date` AS `report_date` from `report_product_sales_data` where ((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11')) order by `report_product_sales_data`.`id` desc limit 320"

}

]

}

},

{

"join_optimization": {

"select#": 1,

"steps": [

{

"condition_processing": {

"condition": "WHERE",

"original_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11'))",

"steps": [

{

"transformation": "equality_propagation",

"resulting_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11') and multiple equal(229, `report_product_sales_data`.`orgz_id`))"

},

{

"transformation": "constant_propagation",

"resulting_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11') and multiple equal(229, `report_product_sales_data`.`orgz_id`))"

},

{

"transformation": "trivial_condition_removal",

"resulting_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11') and multiple equal(229, `report_product_sales_data`.`orgz_id`))"

}

]

}

},

{

"table_dependencies": [

{

"table": "`report_product_sales_data`",

"row_may_be_null": false,

"map_bit": 0,

"depends_on_map_bits": [

]

}

]

},

{

"ref_optimizer_key_uses": [

{

"table": "`report_product_sales_data`",

"field": "hq_code",

"equals": "'000030'",

"null_rejecting": false

},

{

"table": "`report_product_sales_data`",

"field": "hq_code",

"equals": "'000030'",

"null_rejecting": false

},

{

"table": "`report_product_sales_data`",

"field": "orgz_id",

"equals": "229",

"null_rejecting": false

}

]

},

{

"rows_estimation": [

{

"table": "`report_product_sales_data`",

"range_analysis": {

"table_scan": {

"rows": 28276082,

"cost": 6.14e6

},

"potential_range_indices": [

{

"index": "PRIMARY",

"usable": false,

"cause": "not_applicable"

},

{

"index": "report_product_sales_data_unique",

"usable": true,

"key_parts": [

"hq_code",

"report_date",

"orgz_id",

"product_id"

]

},

{

"index": "report_product_sales_data_hq_code_orgz_id_index",

"usable": true,

"key_parts": [

"hq_code",

"orgz_id",

"report_date",

"id"

]

}

],

"setup_range_conditions": [

],

"group_index_range": {

"chosen": false,

"cause": "not_group_by_or_distinct"

},

"analyzing_range_alternatives": {

"range_scan_alternatives": [

{

"index": "report_product_sales_data_unique",

"ranges": [

"000030 <= hq_code <= 000030 AND 2018-05-11 < report_date"

],

"index_dives_for_eq_ranges": true,

"rowid_ordered": false,

"using_mrr": false,

"index_only": false,

"rows": 1848962,

"cost": 2.22e6,

"chosen": true

},

{

"index": "report_product_sales_data_hq_code_orgz_id_index",

"ranges": [

"000030 <= hq_code <= 000030 AND 229 <= orgz_id <= 229 AND 2018-05-11 < report_date"

],

"index_dives_for_eq_ranges": true,

"rowid_ordered": false,

"using_mrr": false,

"index_only": false,

"rows": 37088,

"cost": 44507,

"chosen": true

}

],

"analyzing_roworder_intersect": {

"usable": false,

"cause": "too_few_roworder_scans"

}

},

"chosen_range_access_summary": {

"range_access_plan": {

"type": "range_scan",

"index": "report_product_sales_data_hq_code_orgz_id_index",

"rows": 37088,

"ranges": [

"000030 <= hq_code <= 000030 AND 229 <= orgz_id <= 229 AND 2018-05-11 < report_date"

]

},

"rows_for_plan": 37088,

"cost_for_plan": 44507,

"chosen": true

}

}

}

]

},

{

"considered_execution_plans": [

{

"plan_prefix": [

],

"table": "`report_product_sales_data`",

"best_access_path": {

"considered_access_paths": [

{

"access_type": "ref",

"index": "report_product_sales_data_unique",

"rows": 1.85e6,

"cost": 1.82e6,

"chosen": true

},

{

//可以看到选择report_product_sales_data_hq_code_orgz_id_index这个索引时cost最小

"access_type": "ref",

"index": "report_product_sales_data_hq_code_orgz_id_index",

"rows": 37088,

"cost": 44506,

"chosen": true

},

{

"access_type": "range",

"rows": 27816,

"cost": 51924,

"chosen": false

}

]

},

"cost_for_plan": 44506,

"rows_for_plan": 37088,

"chosen": true

}

]

},

{

"attaching_conditions_to_tables": {

"original_condition": "((`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11'))",

"attached_conditions_computation": [

{

"access_type_changed": {

"table": "`report_product_sales_data`",

"index": "report_product_sales_data_hq_code_orgz_id_index",

"old_type": "ref",

"new_type": "range",

"cause": "uses_more_keyparts"

}

}

],

"attached_conditions_summary": [

{

"table": "`report_product_sales_data`",

"attached": "((`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11'))"

}

]

}

},

{

"clause_processing": {

"clause": "ORDER BY",

"original_clause": "`report_product_sales_data`.`id` desc",

"items": [

{

"item": "`report_product_sales_data`.`id`"

}

],

"resulting_clause_is_simple": true,

"resulting_clause": "`report_product_sales_data`.`id` desc"

}

},

{

"refine_plan": [

{

"table": "`report_product_sales_data`",

"pushed_index_condition": "((`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`report_date` > '2018-05-11'))",

"table_condition_attached": "(`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938))",

"access_type": "range"

}

]

},

{

"reconsidering_access_paths_for_index_ordering": {

//到了order by id这边时,MySQL也没有改变执行计划,还是选择了report_product_sales_data_hq_code_orgz_id_index索引

"clause": "ORDER BY",

"index_order_summary": {

"table": "`report_product_sales_data`",

"index_provides_order": false,

"order_direction": "undefined",

"index": "report_product_sales_data_hq_code_orgz_id_index",

"plan_changed": false

}

}

}

]

}

},

{

"join_execution": {

"select#": 1,

"steps": [

{

"filesort_information": [

{

"direction": "desc",

"table": "`report_product_sales_data`",

"field": "id"

}

],

"filesort_priority_queue_optimization": {

"limit": 320,

"rows_estimate": 61044633,

"row_size": 76,

"memory_available": 262144,

"chosen": true

},

"filesort_execution": [

],

"filesort_summary": {

"rows": 321,

"examined_rows": 15768,

"number_of_tmp_files": 0,

"sort_buffer_size": 26964,

"sort_mode": "<sort_key, additional_fields>"

}

}

]

}

}

]

}-- 对于这条走了非预期PRIMARY主键索引的查询,我们看下优化器的执行过程

select product_id, sales_num, report_date from `report_product_sales_data`

where `hq_code` = '000030'

and `orgz_id` = 229

and `product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)

and `report_date` > '2018-05-11' order by id desc

limit 10;-- 看下trace部分

{

"steps": [

{

"join_preparation": {

"select#": 1,

"steps": [

{

"expanded_query": "/* select#1 */ select `report_product_sales_data`.`product_id` AS `product_id`,`report_product_sales_data`.`sales_num` AS `sales_num`,`report_product_sales_data`.`report_date` AS `report_date` from `report_product_sales_data` where ((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11')) order by `report_product_sales_data`.`id` desc limit 10"

}

]

}

},

{

"join_optimization": {

"select#": 1,

"steps": [

{

"condition_processing": {

"condition": "WHERE",

"original_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11'))",

"steps": [

{

"transformation": "equality_propagation",

"resulting_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11') and multiple equal(229, `report_product_sales_data`.`orgz_id`))"

},

{

"transformation": "constant_propagation",

"resulting_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11') and multiple equal(229, `report_product_sales_data`.`orgz_id`))"

},

{

"transformation": "trivial_condition_removal",

"resulting_condition": "((`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11') and multiple equal(229, `report_product_sales_data`.`orgz_id`))"

}

]

}

},

{

"table_dependencies": [

{

"table": "`report_product_sales_data`",

"row_may_be_null": false,

"map_bit": 0,

"depends_on_map_bits": [

]

}

]

},

{

"ref_optimizer_key_uses": [

{

"table": "`report_product_sales_data`",

"field": "hq_code",

"equals": "'000030'",

"null_rejecting": false

},

{

"table": "`report_product_sales_data`",

"field": "hq_code",

"equals": "'000030'",

"null_rejecting": false

},

{

"table": "`report_product_sales_data`",

"field": "orgz_id",

"equals": "229",

"null_rejecting": false

}

]

},

{

"rows_estimation": [

{

"table": "`report_product_sales_data`",

"range_analysis": {

"table_scan": {

"rows": 28276082,

"cost": 6.14e6

},

"potential_range_indices": [

{

"index": "PRIMARY",

"usable": false,

"cause": "not_applicable"

},

{

"index": "report_product_sales_data_unique",

"usable": true,

"key_parts": [

"hq_code",

"report_date",

"orgz_id",

"product_id"

]

},

{

"index": "report_product_sales_data_hq_code_orgz_id_index",

"usable": true,

"key_parts": [

"hq_code",

"orgz_id",

"report_date",

"id"

]

}

],

"setup_range_conditions": [

],

"group_index_range": {

"chosen": false,

"cause": "not_group_by_or_distinct"

},

"analyzing_range_alternatives": {

"range_scan_alternatives": [

{

"index": "report_product_sales_data_unique",

"ranges": [

"000030 <= hq_code <= 000030 AND 2018-05-11 < report_date"

],

"index_dives_for_eq_ranges": true,

"rowid_ordered": false,

"using_mrr": false,

"index_only": false,

"rows": 1848962,

"cost": 2.22e6,

"chosen": true

},

{

"index": "report_product_sales_data_hq_code_orgz_id_index",

"ranges": [

"000030 <= hq_code <= 000030 AND 229 <= orgz_id <= 229 AND 2018-05-11 < report_date"

],

"index_dives_for_eq_ranges": true,

"rowid_ordered": false,

"using_mrr": false,

"index_only": false,

"rows": 37088,

"cost": 44507,

"chosen": true

}

],

"analyzing_roworder_intersect": {

"usable": false,

"cause": "too_few_roworder_scans"

}

},

"chosen_range_access_summary": {

"range_access_plan": {

"type": "range_scan",

"index": "report_product_sales_data_hq_code_orgz_id_index",

"rows": 37088,

"ranges": [

"000030 <= hq_code <= 000030 AND 229 <= orgz_id <= 229 AND 2018-05-11 < report_date"

]

},

"rows_for_plan": 37088,

"cost_for_plan": 44507,

"chosen": true

}

}

}

]

},

{

"considered_execution_plans": [

{

"plan_prefix": [

],

"table": "`report_product_sales_data`",

"best_access_path": {

"considered_access_paths": [

{

"access_type": "ref",

"index": "report_product_sales_data_unique",

"rows": 1.85e6,

"cost": 1.82e6,

"chosen": true

},

{

//可以看到选择report_product_sales_data_hq_code_orgz_id_index这个索引时cost最小

"access_type": "ref",

"index": "report_product_sales_data_hq_code_orgz_id_index",

"rows": 37088,

"cost": 44506,

"chosen": true

},

{

"access_type": "range",

"rows": 27816,

"cost": 51924,

"chosen": false

}

]

},

"cost_for_plan": 44506,

"rows_for_plan": 37088,

"chosen": true

}

]

},

{

"attaching_conditions_to_tables": {

"original_condition": "((`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11'))",

"attached_conditions_computation": [

{

"access_type_changed": {

"table": "`report_product_sales_data`",

"index": "report_product_sales_data_hq_code_orgz_id_index",

"old_type": "ref",

"new_type": "range",

"cause": "uses_more_keyparts"

}

}

],

"attached_conditions_summary": [

{

"table": "`report_product_sales_data`",

"attached": "((`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)) and (`report_product_sales_data`.`report_date` > '2018-05-11'))"

}

]

}

},

{

"clause_processing": {

"clause": "ORDER BY",

"original_clause": "`report_product_sales_data`.`id` desc",

"items": [

{

"item": "`report_product_sales_data`.`id`"

}

],

"resulting_clause_is_simple": true,

"resulting_clause": "`report_product_sales_data`.`id` desc"

}

},

{

"refine_plan": [

{

"table": "`report_product_sales_data`",

"pushed_index_condition": "((`report_product_sales_data`.`orgz_id` = 229) and (`report_product_sales_data`.`hq_code` = '000030') and (`report_product_sales_data`.`report_date` > '2018-05-11'))",

"table_condition_attached": "(`report_product_sales_data`.`product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938))",

"access_type": "range"

}

]

},

{

"reconsidering_access_paths_for_index_ordering": {

//到了order by id这边时,MySQL改变了执行计划,选择了PRIMARY主键索引

"clause": "ORDER BY",

"index_order_summary": {

"table": "`report_product_sales_data`",

"index_provides_order": true,

"order_direction": "desc",

"disabled_pushed_condition_on_old_index": true,

"index": "PRIMARY",

"plan_changed": true,

"access_type": "index_scan"

}

}

}

]

}

},

{

"join_execution": {

"select#": 1,

"steps": [

]

}

}

]

}

现象及修改方案

  1. 通过现象可以看到MySQL在order by 主键id时,limit值的大小达到了某个临界值后,改变了执行计划,选择了主键索引,但不知道具体的规则究竟是怎样。
  2. 既然如此,就不用order by id这个clause,改为order by report_date,因为id和report_date的大小是正相关的,而且可以走到report_product_sales_data_hq_code_orgz_id_index索引,换了个法子解决了当前这个问题。

explain select product_id, sales_num, report_date from `report_product_sales_data`

where `hq_code` = '000030'

and `orgz_id` = 229

and `product_id` in (11453,11472,11487,11446,11456,12088,11433,114170,11479,11491,11485,11482,70672,68998,154298,11435,11481,11515,122573,167938)

and `report_date` > '2018-05-11'

order by `report_date` desc limit 10;

id  select_type table  type    possible_keys  key key_len ref rows    Extra

1  SIMPLE  report_product_sales_data  range  report_product_sales_data_unique,report_product_sales_data_hq_code_orgz_id_index    report_product_sales_data_hq_code_orgz_id_index 55  NULL    37088  Using index condition; Using where

总结

  • 在order by id的情况下,MySQL由于自身的优化器选择,为了避免某些 排序 的消耗,可能会走非预期的PRIMARY主键索引;
  • order by 和 limit 结合使用,如果where 字段,order by字段都是索引,那么有limit索引会使用order by字段所在的索引,没有limit会使用where 条件的索引;
  • 对于数据量比较大,而且执行量很高的分页sql,尽可能将所有的查询字段包括在索引中,同时使用索引来消除排序;
  • 多用explain查看是否使用到了最优索引;
  • 利用optimizer trace查看优化器执行过程;
  • 观察mysql的slow_query_log,及时做排查优化。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-10/155053.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从问题到程序

从问题到程序

裘宗燕 / 机械工业出版社 / 2011-5 / 39.00元

《从问题到程序:程序设计与C语言引论(第2版)》以C作为工具语言,讨论了基本程序设计的各方面内容,详细解释了与c语言和程序设计有关的问题。在新版中,特别加强了针对近年日益受到业界和学术界广泛重视的问题的讨论,并通过详细地分析和讨论大量符合C99标准的实例,给出了分析和分解问题、找出解决问题的主要步骤、确定函数抽象、找出循环、选择语言结构直至最后做出所需程序的完整过程。 《从问题到程序:程序设......一起来看看 《从问题到程序》 这本书的介绍吧!

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具